#Load packages used in notebook
import pandas as pd
import numpy as np
import seaborn as sns
import datetime
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
from statsmodels.tsa.holtwinters import Holt
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tools.eval_measures import rmse
import matplotlib.pyplot as plt
%matplotlib inline
# Define error metric as a function
def mape(y_actual, y_predicted):
return round(np.mean(np.abs((y_actual - y_predicted) / y_actual)) * 100, 1)
# Load Data from excel file
sales_seg2 = pd.read_excel(r'C:\Users\Mike\Documents\Grad School 2021\Data Science Capstone\Michael_V2_edit.xlsx',
sheet_name = "Data Set D2")
sales_seg2.head(30)
| Product Code | ABC | XYZ | 2019-01-12 00:00:00 | 2019-01-19 00:00:00 | 2019-01-26 00:00:00 | 2019-02-02 00:00:00 | 2019-02-09 00:00:00 | 2019-02-16 00:00:00 | 2019-02-23 00:00:00 | ... | 2022-07-23 00:00:00 | 2022-07-30 00:00:00 | 2022-08-06 00:00:00 | 2022-08-13 00:00:00 | 2022-08-20 00:00:00 | 2022-08-27 00:00:00 | 2022-09-03 00:00:00 | 2022-09-10 00:00:00 | 2022-09-17 00:00:00 | 2022-09-24 00:00:00 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | P385 | B | X | 10341.16 | 11584.67 | 13475.66 | 10921.66 | 10718.16 | 10444.34 | 11484.16 | ... | 12432.168 | 11709.501 | 13303.501 | 10630.003 | 12886.667 | 12385.003 | 12721.171 | 10841.834 | 12489.834 | 12859.335 |
| 1 | P386 | B | X | 18503.50 | 18859.67 | 21890.66 | 22154.82 | 20727.33 | 19390.67 | 18622.67 | ... | 11705.336 | 11847.501 | 14069.336 | 11440.672 | 12779.334 | 11570.670 | 11536.504 | 11672.000 | 10365.335 | 11667.504 |
| 2 | P387 | A | X | 62371.49 | 62779.99 | 68225.84 | 71621.65 | 68234.17 | 58880.00 | 67244.49 | ... | 46474.667 | 49052.165 | 48356.333 | 44600.840 | 47307.832 | 45928.339 | 49034.505 | 44934.666 | 40428.167 | 42539.673 |
| 3 | P388 | A | X | 58262.17 | 58651.17 | 66649.67 | 69476.82 | 62580.32 | 58426.00 | 59887.99 | ... | 48638.335 | 56718.333 | 58260.833 | 53922.671 | 51891.833 | 54119.008 | 52838.340 | 47007.002 | 48752.335 | 47899.172 |
| 4 | P389 | B | X | 21206.50 | 18933.69 | 21748.34 | 26492.49 | 22998.16 | 21996.15 | 22935.32 | ... | 19004.168 | 18411.334 | 23546.337 | 20088.006 | 19457.835 | 19673.009 | 18225.170 | 19332.667 | 19654.168 | 18272.172 |
| 5 | P390 | A | X | 83144.49 | 81917.50 | 97388.00 | 88998.29 | 87861.97 | 80625.50 | 92491.67 | ... | 66547.005 | 73437.335 | 77564.174 | 69624.839 | 71573.835 | 74385.011 | 71403.004 | 68077.334 | 66704.501 | 65659.173 |
| 6 | P391 | A | X | 101224.99 | 101380.00 | 120987.99 | 107066.83 | 108697.83 | 94757.19 | 109902.66 | ... | 80350.338 | 83156.668 | 85998.669 | 88019.672 | 85578.334 | 85924.675 | 86886.171 | 78867.834 | 83234.001 | 80534.006 |
| 7 | P392 | B | X | 15554.83 | 16557.51 | 18365.84 | 15472.34 | 19456.85 | 20174.32 | 19496.50 | ... | 8051.502 | 8532.834 | 9673.504 | 9386.004 | 8981.834 | 8182.677 | 9111.672 | 7999.001 | 9067.167 | 8556.173 |
| 8 | P393 | B | X | 11153.50 | 10874.50 | 12278.50 | 12526.83 | 11942.50 | 10918.66 | 12213.67 | ... | 15806.501 | 16139.501 | 16089.668 | 16368.337 | 18362.835 | 17185.669 | 20911.501 | 18990.169 | 17507.501 | 17627.169 |
| 9 | P394 | A | X | 13298.50 | 13528.67 | 16392.83 | 13624.98 | 18014.84 | 9757.33 | 12287.17 | ... | 33222.001 | 35743.500 | 39047.667 | 39989.835 | 38998.501 | 37235.169 | 38738.168 | 36205.001 | 40947.167 | 30905.167 |
| 10 | P395 | C | Z | 640.00 | 320.00 | 480.00 | 1520.00 | 400.00 | 720.00 | 960.00 | ... | 1120.000 | 1.000 | 400.000 | 800.000 | 400.000 | 320.000 | 960.000 | 1.000 | 880.000 | 880.000 |
| 11 | P396 | C | Y | 400.00 | 400.00 | 720.00 | 1440.00 | 400.00 | 560.00 | 1040.00 | ... | 720.000 | 480.000 | 640.000 | 880.000 | 720.000 | 480.000 | 560.000 | 480.000 | 560.000 | 720.000 |
| 12 | P397 | C | Y | 400.00 | 720.00 | 1200.00 | 2715.00 | 640.00 | 1462.00 | 1200.00 | ... | 1920.000 | 880.000 | 1440.000 | 2640.000 | 1360.000 | 1280.000 | 2000.000 | 720.000 | 1280.000 | 2960.000 |
| 13 | P398 | C | Z | 400.00 | 400.00 | 1200.00 | 1840.00 | 720.00 | 1658.00 | 1680.00 | ... | 1040.000 | 1200.000 | 1120.000 | 2000.000 | 1040.000 | 960.000 | 1280.000 | 560.000 | 1120.000 | 1440.000 |
| 14 | P399 | C | Y | 2080.00 | 3183.00 | 3264.00 | 1552.00 | 1648.00 | 2880.00 | 2432.00 | ... | 1680.000 | 1760.000 | 960.000 | 880.000 | 1440.000 | 1040.000 | 1360.000 | 1200.000 | 1760.000 | 1120.000 |
| 15 | P400 | C | Y | 1440.00 | 2096.00 | 2272.00 | 912.00 | 976.00 | 1152.00 | 1696.00 | ... | 1440.000 | 1280.000 | 320.000 | 240.000 | 1280.000 | 720.000 | 720.000 | 720.000 | 1200.000 | 640.000 |
| 16 | P401 | C | X | 3808.00 | 5007.00 | 7944.00 | 2312.00 | 3918.00 | 5488.00 | 4592.00 | ... | 3200.000 | 3370.000 | 2020.000 | 2000.000 | 3280.000 | 2720.000 | 2640.000 | 2160.000 | 3440.000 | 2480.000 |
| 17 | P402 | C | X | 2976.00 | 3776.00 | 5129.00 | 2032.00 | 2400.00 | 3360.00 | 3552.00 | ... | 2720.000 | 2480.000 | 2080.000 | 1440.000 | 3040.000 | 1520.000 | 1360.000 | 2000.000 | 2560.000 | 1760.000 |
| 18 | P403 | C | Z | 12720.00 | 10800.00 | 12560.00 | 14784.00 | 20080.00 | 14480.00 | 19520.00 | ... | 2160.000 | 2320.000 | 2400.000 | 1920.000 | 2800.000 | 3040.000 | 1760.000 | 1.000 | 3040.000 | 6080.000 |
| 19 | P404 | C | Z | 12560.00 | 9280.00 | 11920.00 | 13760.00 | 19680.00 | 14640.00 | 20080.00 | ... | 640.000 | 2240.000 | 2240.000 | 1840.000 | 2400.000 | 3040.000 | 880.000 | 1.000 | 1520.000 | 5521.000 |
| 20 | P405 | B | X | 5680.00 | 5280.00 | 6000.00 | 6640.00 | 5840.00 | 6400.00 | 5440.00 | ... | 7680.000 | 8240.000 | 10160.000 | 8800.000 | 8400.000 | 9280.000 | 9440.000 | 8160.000 | 9360.000 | 8800.000 |
| 21 | P406 | B | X | 13840.00 | 14480.00 | 14480.00 | 14560.00 | 15280.00 | 14320.00 | 14111.00 | ... | 17280.000 | 18960.000 | 24080.000 | 19664.000 | 19680.000 | 18400.000 | 20640.000 | 18400.000 | 17920.000 | 19760.000 |
| 22 | P407 | A | X | 16240.00 | 20160.00 | 23200.00 | 22560.00 | 22800.00 | 21808.00 | 19280.00 | ... | 27680.000 | 31120.000 | 38960.000 | 31040.000 | 31040.000 | 32299.000 | 33760.000 | 29271.000 | 30560.000 | 31040.000 |
| 23 | P408 | A | X | 19440.00 | 24080.00 | 26320.00 | 23584.00 | 24240.00 | 26956.00 | 24345.00 | ... | 39680.000 | 42880.000 | 54320.000 | 45576.000 | 45200.000 | 43680.000 | 48800.000 | 43920.000 | 42640.000 | 47197.000 |
| 24 | P409 | A | X | 20400.00 | 21840.00 | 25146.00 | 21712.00 | 21760.00 | 24000.00 | 18320.00 | ... | 34800.000 | 38720.000 | 48323.000 | 38584.000 | 41440.000 | 37440.000 | 43228.000 | 38400.000 | 37920.000 | 39360.000 |
| 25 | P410 | C | X | 2320.00 | 3200.00 | 4640.00 | 2640.00 | 4080.00 | 3600.00 | 4451.00 | ... | 3600.000 | 3440.000 | 5200.000 | 5440.000 | 3540.000 | 3200.000 | 5040.000 | 3200.000 | 4640.000 | 2544.000 |
| 26 | P411 | N | P | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | 240.000 | 1360.000 | 1440.000 | 1280.000 | 1600.000 | 640.000 | 2160.000 | 1.000 | 3040.000 | 2160.000 |
| 27 | P412 | A | X | 32380.66 | 33705.84 | 35460.67 | 40816.48 | 37575.16 | 35681.17 | 29089.50 | ... | 50397.670 | 53453.334 | 59114.670 | 55382.504 | 56187.001 | 52692.840 | 56846.502 | 54836.002 | 59670.501 | 54180.835 |
| 28 | P413 | C | Z | 320.00 | 960.00 | 480.00 | 720.00 | 640.00 | 320.00 | 720.00 | ... | 240.000 | 720.000 | 240.000 | 480.000 | 480.000 | 800.000 | 480.000 | 400.000 | 720.000 | 480.000 |
| 29 | P414 | C | Z | 320.00 | 800.00 | 480.00 | 720.00 | 480.00 | 320.00 | 490.00 | ... | 160.000 | 560.000 | 320.000 | 450.000 | 400.000 | 720.000 | 400.000 | 240.000 | 800.000 | 400.000 |
30 rows × 197 columns
# Combine both segmentation columns to get segment identifiers
sales_seg2["vol_vol"] = sales_seg2['ABC']+sales_seg2['XYZ']
segments = pd.DataFrame(sales_seg2.vol_vol.value_counts())
segments
| vol_vol | |
|---|---|
| CX | 25 |
| CY | 19 |
| CZ | 13 |
| NP | 11 |
| AX | 10 |
| BX | 8 |
# Set product code as index for the table
sales_seg2.set_index(['Product Code'], inplace = True)
sales_seg2.head(20)
| ABC | XYZ | 2019-01-12 00:00:00 | 2019-01-19 00:00:00 | 2019-01-26 00:00:00 | 2019-02-02 00:00:00 | 2019-02-09 00:00:00 | 2019-02-16 00:00:00 | 2019-02-23 00:00:00 | 2019-03-02 00:00:00 | ... | 2022-07-30 00:00:00 | 2022-08-06 00:00:00 | 2022-08-13 00:00:00 | 2022-08-20 00:00:00 | 2022-08-27 00:00:00 | 2022-09-03 00:00:00 | 2022-09-10 00:00:00 | 2022-09-17 00:00:00 | 2022-09-24 00:00:00 | vol_vol | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Product Code | |||||||||||||||||||||
| P385 | B | X | 10341.16 | 11584.67 | 13475.66 | 10921.66 | 10718.16 | 10444.34 | 11484.16 | 9770.00 | ... | 11709.501 | 13303.501 | 10630.003 | 12886.667 | 12385.003 | 12721.171 | 10841.834 | 12489.834 | 12859.335 | BX |
| P386 | B | X | 18503.50 | 18859.67 | 21890.66 | 22154.82 | 20727.33 | 19390.67 | 18622.67 | 24461.67 | ... | 11847.501 | 14069.336 | 11440.672 | 12779.334 | 11570.670 | 11536.504 | 11672.000 | 10365.335 | 11667.504 | BX |
| P387 | A | X | 62371.49 | 62779.99 | 68225.84 | 71621.65 | 68234.17 | 58880.00 | 67244.49 | 76281.84 | ... | 49052.165 | 48356.333 | 44600.840 | 47307.832 | 45928.339 | 49034.505 | 44934.666 | 40428.167 | 42539.673 | AX |
| P388 | A | X | 58262.17 | 58651.17 | 66649.67 | 69476.82 | 62580.32 | 58426.00 | 59887.99 | 68231.98 | ... | 56718.333 | 58260.833 | 53922.671 | 51891.833 | 54119.008 | 52838.340 | 47007.002 | 48752.335 | 47899.172 | AX |
| P389 | B | X | 21206.50 | 18933.69 | 21748.34 | 26492.49 | 22998.16 | 21996.15 | 22935.32 | 25290.65 | ... | 18411.334 | 23546.337 | 20088.006 | 19457.835 | 19673.009 | 18225.170 | 19332.667 | 19654.168 | 18272.172 | BX |
| P390 | A | X | 83144.49 | 81917.50 | 97388.00 | 88998.29 | 87861.97 | 80625.50 | 92491.67 | 100542.33 | ... | 73437.335 | 77564.174 | 69624.839 | 71573.835 | 74385.011 | 71403.004 | 68077.334 | 66704.501 | 65659.173 | AX |
| P391 | A | X | 101224.99 | 101380.00 | 120987.99 | 107066.83 | 108697.83 | 94757.19 | 109902.66 | 115165.79 | ... | 83156.668 | 85998.669 | 88019.672 | 85578.334 | 85924.675 | 86886.171 | 78867.834 | 83234.001 | 80534.006 | AX |
| P392 | B | X | 15554.83 | 16557.51 | 18365.84 | 15472.34 | 19456.85 | 20174.32 | 19496.50 | 19401.12 | ... | 8532.834 | 9673.504 | 9386.004 | 8981.834 | 8182.677 | 9111.672 | 7999.001 | 9067.167 | 8556.173 | BX |
| P393 | B | X | 11153.50 | 10874.50 | 12278.50 | 12526.83 | 11942.50 | 10918.66 | 12213.67 | 8540.16 | ... | 16139.501 | 16089.668 | 16368.337 | 18362.835 | 17185.669 | 20911.501 | 18990.169 | 17507.501 | 17627.169 | BX |
| P394 | A | X | 13298.50 | 13528.67 | 16392.83 | 13624.98 | 18014.84 | 9757.33 | 12287.17 | 14428.85 | ... | 35743.500 | 39047.667 | 39989.835 | 38998.501 | 37235.169 | 38738.168 | 36205.001 | 40947.167 | 30905.167 | AX |
| P395 | C | Z | 640.00 | 320.00 | 480.00 | 1520.00 | 400.00 | 720.00 | 960.00 | 400.00 | ... | 1.000 | 400.000 | 800.000 | 400.000 | 320.000 | 960.000 | 1.000 | 880.000 | 880.000 | CZ |
| P396 | C | Y | 400.00 | 400.00 | 720.00 | 1440.00 | 400.00 | 560.00 | 1040.00 | 560.00 | ... | 480.000 | 640.000 | 880.000 | 720.000 | 480.000 | 560.000 | 480.000 | 560.000 | 720.000 | CY |
| P397 | C | Y | 400.00 | 720.00 | 1200.00 | 2715.00 | 640.00 | 1462.00 | 1200.00 | 1040.00 | ... | 880.000 | 1440.000 | 2640.000 | 1360.000 | 1280.000 | 2000.000 | 720.000 | 1280.000 | 2960.000 | CY |
| P398 | C | Z | 400.00 | 400.00 | 1200.00 | 1840.00 | 720.00 | 1658.00 | 1680.00 | 720.00 | ... | 1200.000 | 1120.000 | 2000.000 | 1040.000 | 960.000 | 1280.000 | 560.000 | 1120.000 | 1440.000 | CZ |
| P399 | C | Y | 2080.00 | 3183.00 | 3264.00 | 1552.00 | 1648.00 | 2880.00 | 2432.00 | 3376.00 | ... | 1760.000 | 960.000 | 880.000 | 1440.000 | 1040.000 | 1360.000 | 1200.000 | 1760.000 | 1120.000 | CY |
| P400 | C | Y | 1440.00 | 2096.00 | 2272.00 | 912.00 | 976.00 | 1152.00 | 1696.00 | 2672.00 | ... | 1280.000 | 320.000 | 240.000 | 1280.000 | 720.000 | 720.000 | 720.000 | 1200.000 | 640.000 | CY |
| P401 | C | X | 3808.00 | 5007.00 | 7944.00 | 2312.00 | 3918.00 | 5488.00 | 4592.00 | 6420.00 | ... | 3370.000 | 2020.000 | 2000.000 | 3280.000 | 2720.000 | 2640.000 | 2160.000 | 3440.000 | 2480.000 | CX |
| P402 | C | X | 2976.00 | 3776.00 | 5129.00 | 2032.00 | 2400.00 | 3360.00 | 3552.00 | 4598.00 | ... | 2480.000 | 2080.000 | 1440.000 | 3040.000 | 1520.000 | 1360.000 | 2000.000 | 2560.000 | 1760.000 | CX |
| P403 | C | Z | 12720.00 | 10800.00 | 12560.00 | 14784.00 | 20080.00 | 14480.00 | 19520.00 | 12368.00 | ... | 2320.000 | 2400.000 | 1920.000 | 2800.000 | 3040.000 | 1760.000 | 1.000 | 3040.000 | 6080.000 | CZ |
| P404 | C | Z | 12560.00 | 9280.00 | 11920.00 | 13760.00 | 19680.00 | 14640.00 | 20080.00 | 12541.00 | ... | 2240.000 | 2240.000 | 1840.000 | 2400.000 | 3040.000 | 880.000 | 1.000 | 1520.000 | 5521.000 | CZ |
20 rows × 197 columns
# Separate out segments
sales2_ax = sales_seg2.loc[(sales_seg2.ABC == "A") & (sales_seg2.XYZ == "X")]
sales2_bx = sales_seg2.loc[(sales_seg2.ABC == "B") & (sales_seg2.XYZ == "X")]
sales2_cx = sales_seg2.loc[(sales_seg2.ABC == "C") & (sales_seg2.XYZ == "X")]
sales2_cy = sales_seg2.loc[(sales_seg2.ABC == "C") & (sales_seg2.XYZ == "Y")]
sales2_cz = sales_seg2.loc[(sales_seg2.ABC == "C") & (sales_seg2.XYZ == "Z")]
sales2_np = sales_seg2.loc[(sales_seg2.ABC == "N") & (sales_seg2.XYZ == "P")]
pd.set_option('display.max_columns', None)
# Check a segment
sales2_ax.head(10)
| ABC | XYZ | 2019-01-12 00:00:00 | 2019-01-19 00:00:00 | 2019-01-26 00:00:00 | 2019-02-02 00:00:00 | 2019-02-09 00:00:00 | 2019-02-16 00:00:00 | 2019-02-23 00:00:00 | 2019-03-02 00:00:00 | 2019-03-09 00:00:00 | 2019-03-16 00:00:00 | 2019-03-23 00:00:00 | 2019-03-30 00:00:00 | 2019-04-06 00:00:00 | 2019-04-13 00:00:00 | 2019-04-20 00:00:00 | 2019-04-27 00:00:00 | 2019-05-04 00:00:00 | 2019-05-11 00:00:00 | 2019-05-18 00:00:00 | 2019-05-25 00:00:00 | 2019-06-01 00:00:00 | 2019-06-08 00:00:00 | 2019-06-15 00:00:00 | 2019-06-22 00:00:00 | 2019-06-29 00:00:00 | 2019-07-06 00:00:00 | 2019-07-13 00:00:00 | 2019-07-20 00:00:00 | 2019-07-27 00:00:00 | 2019-08-03 00:00:00 | 2019-08-10 00:00:00 | 2019-08-17 00:00:00 | 2019-08-24 00:00:00 | 2019-08-31 00:00:00 | 2019-09-07 00:00:00 | 2019-09-14 00:00:00 | 2019-09-21 00:00:00 | 2019-09-28 00:00:00 | 2019-10-05 00:00:00 | 2019-10-12 00:00:00 | 2019-10-19 00:00:00 | 2019-10-26 00:00:00 | 2019-11-02 00:00:00 | 2019-11-09 00:00:00 | 2019-11-16 00:00:00 | 2019-11-23 00:00:00 | 2019-11-30 00:00:00 | 2019-12-07 00:00:00 | 2019-12-14 00:00:00 | 2019-12-21 00:00:00 | 2019-12-28 00:00:00 | 2020-01-04 00:00:00 | 2020-01-11 00:00:00 | 2020-01-18 00:00:00 | 2020-01-25 00:00:00 | 2020-02-01 00:00:00 | 2020-02-08 00:00:00 | 2020-02-15 00:00:00 | 2020-02-22 00:00:00 | 2020-02-29 00:00:00 | 2020-03-07 00:00:00 | 2020-03-14 00:00:00 | 2020-03-21 00:00:00 | 2020-03-28 00:00:00 | 2020-04-04 00:00:00 | 2020-04-11 00:00:00 | 2020-04-18 00:00:00 | 2020-04-25 00:00:00 | 2020-05-02 00:00:00 | 2020-05-09 00:00:00 | 2020-05-16 00:00:00 | 2020-05-23 00:00:00 | 2020-05-30 00:00:00 | 2020-06-06 00:00:00 | 2020-06-13 00:00:00 | 2020-06-20 00:00:00 | 2020-06-27 00:00:00 | 2020-07-04 00:00:00 | 2020-07-11 00:00:00 | 2020-07-18 00:00:00 | 2020-07-25 00:00:00 | 2020-08-01 00:00:00 | 2020-08-08 00:00:00 | 2020-08-15 00:00:00 | 2020-08-22 00:00:00 | 2020-08-29 00:00:00 | 2020-09-05 00:00:00 | 2020-09-12 00:00:00 | 2020-09-19 00:00:00 | 2020-09-26 00:00:00 | 2020-10-03 00:00:00 | 2020-10-10 00:00:00 | 2020-10-17 00:00:00 | 2020-10-24 00:00:00 | 2020-10-31 00:00:00 | 2020-11-07 00:00:00 | 2020-11-14 00:00:00 | 2020-11-21 00:00:00 | 2020-11-28 00:00:00 | 2020-12-05 00:00:00 | 2020-12-12 00:00:00 | 2020-12-19 00:00:00 | 2020-12-26 00:00:00 | 2021-01-02 00:00:00 | 2021-01-09 00:00:00 | 2021-01-16 00:00:00 | 2021-01-23 00:00:00 | 2021-01-30 00:00:00 | 2021-02-06 00:00:00 | 2021-02-13 00:00:00 | 2021-02-20 00:00:00 | 2021-02-27 00:00:00 | 2021-03-06 00:00:00 | 2021-03-13 00:00:00 | 2021-03-20 00:00:00 | 2021-03-27 00:00:00 | 2021-04-03 00:00:00 | 2021-04-10 00:00:00 | 2021-04-17 00:00:00 | 2021-04-24 00:00:00 | 2021-05-01 00:00:00 | 2021-05-08 00:00:00 | 2021-05-15 00:00:00 | 2021-05-22 00:00:00 | 2021-05-29 00:00:00 | 2021-06-05 00:00:00 | 2021-06-12 00:00:00 | 2021-06-19 00:00:00 | 2021-06-26 00:00:00 | 2021-07-03 00:00:00 | 2021-07-10 00:00:00 | 2021-07-17 00:00:00 | 2021-07-24 00:00:00 | 2021-07-31 00:00:00 | 2021-08-07 00:00:00 | 2021-08-14 00:00:00 | 2021-08-21 00:00:00 | 2021-08-28 00:00:00 | 2021-09-04 00:00:00 | 2021-09-11 00:00:00 | 2021-09-18 00:00:00 | 2021-09-25 00:00:00 | 2021-10-02 00:00:00 | 2021-10-09 00:00:00 | 2021-10-16 00:00:00 | 2021-10-23 00:00:00 | 2021-10-30 00:00:00 | 2021-11-06 00:00:00 | 2021-11-13 00:00:00 | 2021-11-20 00:00:00 | 2021-11-27 00:00:00 | 2021-12-04 00:00:00 | 2021-12-11 00:00:00 | 2021-12-18 00:00:00 | 2021-12-25 00:00:00 | 2022-01-01 00:00:00 | 2022-01-08 00:00:00 | 2022-01-15 00:00:00 | 2022-01-22 00:00:00 | 2022-01-29 00:00:00 | 2022-02-05 00:00:00 | 2022-02-12 00:00:00 | 2022-02-19 00:00:00 | 2022-02-26 00:00:00 | 2022-03-05 00:00:00 | 2022-03-12 00:00:00 | 2022-03-19 00:00:00 | 2022-03-26 00:00:00 | 2022-04-02 00:00:00 | 2022-04-09 00:00:00 | 2022-04-16 00:00:00 | 2022-04-23 00:00:00 | 2022-04-30 00:00:00 | 2022-05-07 00:00:00 | 2022-05-14 00:00:00 | 2022-05-21 00:00:00 | 2022-05-28 00:00:00 | 2022-06-04 00:00:00 | 2022-06-11 00:00:00 | 2022-06-18 00:00:00 | 2022-06-25 00:00:00 | 2022-07-02 00:00:00 | 2022-07-09 00:00:00 | 2022-07-16 00:00:00 | 2022-07-23 00:00:00 | 2022-07-30 00:00:00 | 2022-08-06 00:00:00 | 2022-08-13 00:00:00 | 2022-08-20 00:00:00 | 2022-08-27 00:00:00 | 2022-09-03 00:00:00 | 2022-09-10 00:00:00 | 2022-09-17 00:00:00 | 2022-09-24 00:00:00 | vol_vol | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Product Code | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| P387 | A | X | 62371.49 | 62779.99 | 68225.84 | 71621.65 | 68234.17 | 58880.00 | 67244.49 | 76281.84 | 63265.34 | 61127.98 | 66557.84 | 74726.65 | 53491.67 | 55743.67 | 62758.49 | 61497.33 | 51909.15 | 53151.83 | 57007.15 | 63000.33 | 54083.97 | 65365.00 | 55128.98 | 59260.34 | 63893.66 | 56748.67 | 64557.66 | 59949.02 | 59609.83 | 67279.81 | 65285.16 | 59453.49 | 65569.33 | 61019.17 | 63622.64 | 59531.50 | 57594.67 | 69458.67 | 57921.47 | 51054.01 | 52167.67 | 54470.67 | 61481.19 | 54495.65 | 51411.00 | 61295.49 | 55016.16 | 57467.64 | 52920.17 | 57695.34 | 54961.83 | 59786.83 | 59067.00 | 69213.66 | 69716.49 | 66005.65 | 70319.34 | 66028.50 | 66006.66 | 71885.67 | 66905.18 | 73888.51 | 62826.84 | 63821.50 | 79741.30 | 95231.83 | 76889.66 | 80514.33 | 81787.84 | 85640.66 | 72790.32 | 69660.49 | 70025.67 | 68339.98 | 55639.66 | 67509.50 | 68629.34 | 68622.33 | 71268.66 | 74958.16 | 64225.51 | 60787.82 | 62009.16 | 65648.99 | 60351.51 | 63344.34 | 72315.31 | 73753.83 | 78717.49 | 67316.66 | 59794.66 | 61344.66 | 63479.66 | 63364.68 | 69561.00 | 60063.47 | 62181.50 | 67016.67 | 55592.67 | 62097.99 | 53879.84 | 63486.82 | 62335.67 | 72048.97 | 72835.66 | 70989.84 | 66038.00 | 70256.83 | 65447.47 | 57292.50 | 67055.01 | 75895.33 | 78698.46 | 85289.50 | 70760.67 | 59404.49 | 57388.99 | 62605.17 | 57955.50 | 59246.00 | 61182.11 | 61447.33 | 66446.34 | 56182.50 | 60546.83 | 61715.49 | 57970.50 | 68347.33 | 62051.83 | 65732.66 | 58311.16 | 55907.34 | 61026.16 | 65177.34 | 41288.001 | 44726.003 | 59024.835 | 67089.000 | 65332.839 | 65277.0 | 60149.669 | 65155.341 | 63541.002 | 56619.834 | 53947.834 | 62798.667 | 63990.003 | 58579.168 | 54783.002 | 56652.835 | 47309.169 | 50134.002 | 53549.835 | 57127.003 | 49679.173 | 52055.170 | 66831.672 | 58656.176 | 59791.842 | 67976.180 | 52345.838 | 61066.338 | 56373.174 | 41758.504 | 78698.46 | 85289.50 | 70760.67 | 59404.49 | 57388.99 | 62605.17 | 57955.50 | 59246.00 | 61182.11 | 60150.499 | 59602.837 | 48800.676 | 54657.341 | 42188.673 | 47013.668 | 47399.671 | 50099.006 | 46565.000 | 46776.667 | 42457.672 | 46474.667 | 49052.165 | 48356.333 | 44600.840 | 47307.832 | 45928.339 | 49034.505 | 44934.666 | 40428.167 | 42539.673 | AX |
| P388 | A | X | 58262.17 | 58651.17 | 66649.67 | 69476.82 | 62580.32 | 58426.00 | 59887.99 | 68231.98 | 58946.19 | 62627.02 | 65337.50 | 74115.98 | 57349.66 | 58749.16 | 67950.15 | 62835.85 | 52444.33 | 59088.17 | 56211.15 | 64363.65 | 59030.33 | 64076.66 | 60888.17 | 59893.32 | 65719.17 | 59996.34 | 63283.84 | 60856.83 | 58264.00 | 66721.99 | 64533.82 | 59863.67 | 68028.33 | 65165.50 | 63438.83 | 62167.66 | 61261.50 | 68500.50 | 57000.33 | 55486.99 | 54397.32 | 54944.17 | 62273.01 | 53311.84 | 52872.16 | 59121.67 | 55349.16 | 54141.82 | 53493.83 | 56267.66 | 54167.83 | 61142.16 | 62439.00 | 69269.15 | 71005.00 | 68341.85 | 71414.33 | 64255.66 | 66500.51 | 70024.83 | 68970.34 | 69987.51 | 62952.99 | 58795.17 | 80411.18 | 82931.33 | 85290.47 | 74261.83 | 81114.66 | 81535.33 | 77689.82 | 74087.16 | 79873.68 | 70354.16 | 61454.83 | 71311.33 | 72129.18 | 73928.01 | 75633.99 | 72453.32 | 67623.16 | 58623.45 | 65087.50 | 68975.84 | 62177.83 | 64677.01 | 75814.46 | 74663.00 | 77899.33 | 67478.98 | 65595.47 | 64200.32 | 68837.67 | 65351.99 | 69699.17 | 61259.46 | 60469.66 | 67387.02 | 58481.50 | 64507.64 | 54795.68 | 66612.33 | 62351.67 | 72442.29 | 77432.84 | 73505.50 | 70995.33 | 77882.34 | 68364.15 | 57707.84 | 64500.83 | 73219.65 | 82794.47 | 87968.32 | 72838.01 | 71934.49 | 63484.98 | 63621.83 | 63490.00 | 71111.66 | 64818.16 | 65378.66 | 72147.16 | 61558.33 | 65357.33 | 67530.14 | 62946.33 | 72637.15 | 68793.33 | 70392.33 | 59364.34 | 62166.15 | 69172.32 | 67814.17 | 42826.001 | 51512.169 | 56930.335 | 76491.500 | 71799.339 | 65492.0 | 69441.335 | 64968.840 | 64017.169 | 63666.835 | 56954.501 | 64588.001 | 67882.338 | 60662.168 | 59367.669 | 55948.170 | 49230.334 | 61896.170 | 51287.502 | 59319.503 | 51976.671 | 68261.003 | 63435.172 | 66054.508 | 71488.675 | 78308.845 | 62117.003 | 68287.174 | 61647.507 | 44236.169 | 82794.47 | 87968.32 | 72838.01 | 71934.49 | 63484.98 | 63621.83 | 63490.00 | 71111.66 | 64818.16 | 71063.334 | 65847.668 | 58107.172 | 63645.673 | 55904.832 | 55395.836 | 57730.670 | 59567.004 | 52811.003 | 57097.833 | 52687.836 | 48638.335 | 56718.333 | 58260.833 | 53922.671 | 51891.833 | 54119.008 | 52838.340 | 47007.002 | 48752.335 | 47899.172 | AX |
| P390 | A | X | 83144.49 | 81917.50 | 97388.00 | 88998.29 | 87861.97 | 80625.50 | 92491.67 | 100542.33 | 85768.99 | 96474.16 | 82880.50 | 107533.51 | 82903.17 | 89241.79 | 96730.65 | 92271.83 | 79753.82 | 86932.17 | 81297.98 | 89679.17 | 85851.82 | 95626.14 | 86417.81 | 88411.66 | 90138.65 | 88140.81 | 95041.50 | 83208.49 | 78857.50 | 93960.99 | 93085.02 | 83881.50 | 98442.15 | 93292.16 | 86906.64 | 86671.33 | 85238.00 | 99818.33 | 88908.14 | 75193.66 | 69798.66 | 79383.49 | 84544.50 | 77551.82 | 73927.16 | 83677.32 | 72935.65 | 79808.31 | 73733.00 | 78417.33 | 76521.51 | 87419.13 | 91000.99 | 90625.98 | 104909.66 | 104009.13 | 99053.49 | 96545.48 | 98953.33 | 108505.83 | 98278.85 | 103854.33 | 94330.34 | 86729.16 | 109644.48 | 120444.83 | 116933.66 | 111969.00 | 119319.64 | 105064.17 | 97510.99 | 97233.51 | 104514.99 | 101208.15 | 88273.99 | 95812.50 | 105196.00 | 109332.34 | 110776.64 | 107282.81 | 98461.00 | 97198.83 | 94163.35 | 102452.99 | 94056.49 | 98702.66 | 114467.29 | 108585.49 | 109295.50 | 100402.82 | 98268.97 | 94058.51 | 101034.67 | 97014.83 | 107374.16 | 93661.98 | 89836.67 | 101967.15 | 83780.34 | 99630.83 | 74618.17 | 103234.49 | 91026.50 | 111666.64 | 112667.49 | 103944.17 | 113677.49 | 105494.99 | 98988.79 | 98585.18 | 105689.35 | 114759.49 | 125953.51 | 134032.49 | 109847.67 | 96957.50 | 89500.01 | 88828.17 | 90942.99 | 96816.66 | 97082.99 | 96173.65 | 110476.84 | 89419.98 | 91388.17 | 104583.13 | 87768.33 | 103804.65 | 103146.17 | 103533.34 | 88525.01 | 81088.15 | 95862.84 | 101410.67 | 55052.668 | 64876.336 | 75796.336 | 113211.000 | 101872.509 | 107584.0 | 91892.668 | 91240.841 | 92093.838 | 80707.835 | 77520.169 | 97010.002 | 97344.839 | 92690.503 | 83087.170 | 85982.667 | 63627.669 | 87148.836 | 69909.834 | 79136.839 | 78429.003 | 84319.174 | 97331.674 | 92747.508 | 92628.341 | 101458.178 | 84833.506 | 90708.671 | 90749.674 | 71424.837 | 125953.51 | 134032.49 | 109847.67 | 96957.50 | 89500.01 | 88828.17 | 90942.99 | 96816.66 | 97082.99 | 73370.334 | 87814.170 | 80389.675 | 85443.176 | 70851.338 | 72484.671 | 76856.007 | 73547.007 | 67789.004 | 73886.668 | 65692.840 | 66547.005 | 73437.335 | 77564.174 | 69624.839 | 71573.835 | 74385.011 | 71403.004 | 68077.334 | 66704.501 | 65659.173 | AX |
| P391 | A | X | 101224.99 | 101380.00 | 120987.99 | 107066.83 | 108697.83 | 94757.19 | 109902.66 | 115165.79 | 101136.51 | 104434.00 | 94551.00 | 110340.49 | 96096.65 | 95300.48 | 106518.99 | 104022.67 | 84268.51 | 95912.16 | 90337.65 | 100851.15 | 90128.34 | 108912.99 | 93865.68 | 100742.83 | 101814.83 | 97443.00 | 107127.67 | 92299.16 | 94775.33 | 104607.50 | 104674.00 | 98188.00 | 111562.82 | 101887.50 | 99438.33 | 102742.83 | 95288.33 | 109359.02 | 92137.98 | 87250.82 | 87045.81 | 90155.34 | 95574.98 | 91292.16 | 91468.15 | 94903.51 | 91684.33 | 94548.97 | 86683.83 | 90542.81 | 93941.83 | 100717.97 | 107155.16 | 103726.83 | 114870.33 | 115081.99 | 113383.83 | 103723.15 | 110173.15 | 124765.01 | 110467.65 | 117012.84 | 102281.52 | 96132.18 | 121445.16 | 120267.00 | 135332.98 | 126075.66 | 133362.66 | 114331.50 | 111225.32 | 105400.84 | 111563.66 | 106046.48 | 104972.84 | 111706.50 | 116292.85 | 123126.34 | 117784.34 | 126558.68 | 108545.67 | 103796.52 | 107044.82 | 109892.83 | 109872.00 | 111349.34 | 123160.67 | 120775.01 | 131107.67 | 108208.83 | 105317.16 | 108091.16 | 111126.50 | 113984.33 | 113466.50 | 106524.34 | 109027.51 | 109144.66 | 98054.50 | 122221.35 | 92087.15 | 113700.99 | 102567.17 | 130901.79 | 126438.33 | 118389.50 | 126116.00 | 117948.49 | 110983.01 | 104578.99 | 113286.33 | 135763.65 | 148291.99 | 148147.66 | 127940.18 | 104349.83 | 105970.13 | 102110.51 | 109207.48 | 110051.50 | 109336.99 | 109655.01 | 117724.84 | 102234.66 | 106925.99 | 115479.99 | 104467.00 | 121705.64 | 117201.67 | 112478.33 | 101856.00 | 91176.98 | 109176.82 | 109848.66 | 62963.501 | 77967.003 | 93323.502 | 134538.334 | 110401.836 | 124892.0 | 106106.002 | 105811.842 | 100199.840 | 95905.834 | 87201.002 | 107888.835 | 113446.841 | 104616.669 | 102724.169 | 103958.501 | 79333.501 | 101777.001 | 86666.002 | 91092.838 | 91128.339 | 107335.001 | 114447.343 | 99812.009 | 104431.341 | 114192.177 | 114403.337 | 116247.506 | 102316.508 | 87750.171 | 148291.99 | 148147.66 | 127940.18 | 104349.83 | 105970.13 | 102110.51 | 109207.48 | 110051.50 | 109336.99 | 79313.834 | 111991.504 | 95377.012 | 97822.009 | 78501.335 | 88226.338 | 89841.007 | 93574.838 | 78703.170 | 84938.835 | 80838.336 | 80350.338 | 83156.668 | 85998.669 | 88019.672 | 85578.334 | 85924.675 | 86886.171 | 78867.834 | 83234.001 | 80534.006 | AX |
| P394 | A | X | 13298.50 | 13528.67 | 16392.83 | 13624.98 | 18014.84 | 9757.33 | 12287.17 | 14428.85 | 13687.49 | 12792.34 | 15948.33 | 14535.50 | 15189.33 | 17070.66 | 21598.67 | 16587.66 | 16656.66 | 17450.16 | 16388.50 | 15336.17 | 15387.00 | 15924.00 | 15878.00 | 18522.83 | 16989.34 | 15437.65 | 18002.50 | 15720.00 | 17226.67 | 17976.00 | 18294.83 | 18192.00 | 18978.17 | 19183.16 | 19235.34 | 19725.67 | 19865.50 | 18338.50 | 17767.49 | 17049.17 | 16403.34 | 20001.99 | 18562.00 | 18289.49 | 17241.33 | 18279.00 | 20685.51 | 17885.33 | 16533.00 | 17522.16 | 27098.33 | 33490.33 | 23026.50 | 22612.33 | 24291.33 | 27538.33 | 27000.33 | 21391.33 | 27682.00 | 28431.83 | 29920.17 | 37827.33 | 29286.00 | 26588.50 | 29363.00 | 19465.33 | 32871.83 | 30842.99 | 28782.84 | 34394.34 | 32892.66 | 34254.34 | 30822.33 | 32981.33 | 29595.67 | 31904.50 | 33461.00 | 31974.18 | 31982.49 | 32136.84 | 36877.49 | 31242.65 | 34379.50 | 31548.84 | 31978.50 | 33991.00 | 31162.17 | 31634.99 | 26955.00 | 34962.50 | 26579.99 | 31800.49 | 33062.67 | 33122.83 | 30799.83 | 28001.98 | 30592.16 | 32028.33 | 30330.66 | 29868.16 | 30984.99 | 28899.67 | 25589.17 | 32993.51 | 31243.33 | 33008.17 | 32084.00 | 35731.66 | 31803.00 | 34332.66 | 36428.67 | 37864.83 | 36998.99 | 36916.17 | 34364.84 | 34128.84 | 37471.84 | 34723.33 | 33136.66 | 34019.16 | 35781.15 | 33141.67 | 35487.83 | 32941.67 | 35439.34 | 34053.49 | 34340.83 | 33055.83 | 33976.17 | 34416.17 | 34565.00 | 39466.17 | 39059.33 | 37977.66 | 22985.000 | 30879.000 | 34279.335 | 38894.000 | 37019.168 | 32228.0 | 36051.000 | 37636.004 | 34992.502 | 34424.835 | 35739.001 | 35828.000 | 33562.669 | 36198.001 | 33268.334 | 30057.334 | 29854.000 | 42279.001 | 31850.834 | 34889.001 | 30051.837 | 32864.668 | 29147.840 | 36255.001 | 26616.000 | 31731.171 | 28430.667 | 33867.001 | 21347.168 | 24123.168 | 36998.99 | 36916.17 | 34364.84 | 34128.84 | 37471.84 | 34723.33 | 33136.66 | 34019.16 | 35781.15 | 44219.000 | 31469.834 | 30536.834 | 33220.834 | 33249.500 | 38130.501 | 38508.836 | 35239.334 | 36133.169 | 37116.167 | 33423.334 | 33222.001 | 35743.500 | 39047.667 | 39989.835 | 38998.501 | 37235.169 | 38738.168 | 36205.001 | 40947.167 | 30905.167 | AX |
| P407 | A | X | 16240.00 | 20160.00 | 23200.00 | 22560.00 | 22800.00 | 21808.00 | 19280.00 | 28893.00 | 21160.00 | 24720.00 | 19239.00 | 27433.00 | 24432.00 | 23680.00 | 18880.00 | 24399.00 | 21184.00 | 22400.00 | 23836.00 | 23200.00 | 23840.00 | 24800.00 | 23040.00 | 24400.00 | 23680.00 | 24240.00 | 21520.00 | 23280.00 | 24400.00 | 23680.00 | 25520.00 | 22880.00 | 24560.00 | 24480.00 | 28560.00 | 22907.00 | 24800.00 | 23892.00 | 21049.00 | 25532.00 | 26720.00 | 24397.00 | 25040.00 | 24560.00 | 31599.00 | 31117.00 | 9680.00 | 23504.00 | 26080.00 | 20800.00 | 23040.00 | 29200.00 | 25280.00 | 28960.00 | 31200.00 | 30880.00 | 32480.00 | 32240.00 | 32320.00 | 30480.00 | 32656.00 | 33600.00 | 29920.00 | 28640.00 | 34836.00 | 28304.00 | 31336.00 | 35519.00 | 34112.00 | 29760.00 | 36688.00 | 30560.00 | 29920.00 | 32080.00 | 26800.00 | 30960.00 | 13520.00 | 44226.00 | 26864.00 | 26240.00 | 27840.00 | 26480.00 | 32240.00 | 32079.00 | 24240.00 | 30640.00 | 28914.00 | 29520.00 | 24624.00 | 29680.00 | 30880.00 | 30320.00 | 27520.00 | 29200.00 | 28320.00 | 26960.00 | 28480.00 | 24400.00 | 28240.00 | 26069.00 | 28640.00 | 28638.00 | 24320.00 | 28160.00 | 32640.00 | 32400.00 | 32640.00 | 34160.00 | 32000.00 | 33760.00 | 32080.00 | 31600.00 | 34640.00 | 33760.00 | 37088.00 | 34080.00 | 29621.00 | 28560.00 | 33440.00 | 24000.00 | 36240.00 | 30800.00 | 27920.00 | 30480.00 | 31120.00 | 30880.00 | 30960.00 | 29040.00 | 28160.00 | 36800.00 | 24240.00 | 31680.00 | 33680.00 | 33360.00 | 21824.000 | 25200.000 | 25680.000 | 32640.000 | 30000.000 | 23200.0 | 27520.000 | 31664.000 | 28400.000 | 29440.000 | 28240.000 | 28320.000 | 28618.000 | 28560.000 | 27520.000 | 29360.000 | 24800.000 | 30421.000 | 29120.000 | 27280.000 | 18994.000 | 34160.000 | 31120.000 | 24560.000 | 29689.000 | 31360.000 | 27132.000 | 29463.000 | 24962.000 | 37824.000 | 34640.00 | 33760.00 | 37088.00 | 34080.00 | 29621.00 | 28560.00 | 33440.00 | 24000.00 | 36240.00 | 22080.000 | 28080.000 | 27749.000 | 29920.000 | 27919.000 | 31600.000 | 29200.000 | 34720.000 | 29280.000 | 28960.000 | 27920.000 | 27680.000 | 31120.000 | 38960.000 | 31040.000 | 31040.000 | 32299.000 | 33760.000 | 29271.000 | 30560.000 | 31040.000 | AX |
| P408 | A | X | 19440.00 | 24080.00 | 26320.00 | 23584.00 | 24240.00 | 26956.00 | 24345.00 | 35908.00 | 25635.00 | 29378.00 | 23840.00 | 30212.00 | 27159.00 | 28640.00 | 27440.00 | 28640.00 | 22768.00 | 26000.00 | 19840.00 | 25440.00 | 26701.00 | 28400.00 | 25600.00 | 27120.00 | 25760.00 | 26960.00 | 26000.00 | 26240.00 | 26800.00 | 27840.00 | 29760.00 | 25680.00 | 28800.00 | 29279.00 | 28720.00 | 30496.00 | 28532.00 | 26453.00 | 30014.00 | 27457.00 | 31691.00 | 29120.00 | 29277.00 | 28737.00 | 33868.00 | 40281.00 | 12320.00 | 27984.00 | 30320.00 | 24080.00 | 26880.00 | 34000.00 | 29999.00 | 31359.00 | 37440.00 | 39260.00 | 40718.00 | 37920.00 | 36320.00 | 37520.00 | 39760.00 | 40560.00 | 37520.00 | 34240.00 | 42680.00 | 34304.00 | 38720.00 | 41120.00 | 37827.00 | 32880.00 | 41600.00 | 37520.00 | 33440.00 | 39760.00 | 37360.00 | 38000.00 | 18160.00 | 54544.00 | 32800.00 | 33120.00 | 37280.00 | 33488.00 | 41440.00 | 40640.00 | 32800.00 | 38160.00 | 37933.00 | 39632.00 | 32880.00 | 36880.00 | 41360.00 | 37200.00 | 36320.00 | 39680.00 | 37680.00 | 36624.00 | 35573.00 | 32800.00 | 38800.00 | 36200.00 | 38320.00 | 37408.00 | 31280.00 | 35280.00 | 41680.00 | 42720.00 | 41440.00 | 43920.00 | 42399.00 | 43280.00 | 63840.00 | 60720.00 | 45408.00 | 50639.00 | 59328.00 | 19920.00 | 18864.00 | 32800.00 | 35520.00 | 28720.00 | 49253.00 | 42400.00 | 39200.00 | 39040.00 | 41360.00 | 42789.00 | 40640.00 | 37440.00 | 38400.00 | 48000.00 | 33360.00 | 46320.00 | 45680.00 | 42720.00 | 28784.000 | 31680.000 | 31440.000 | 42400.000 | 38320.000 | 29920.0 | 37760.000 | 40880.000 | 37520.000 | 40842.000 | 37600.000 | 39120.000 | 38720.000 | 36880.000 | 39040.000 | 41440.000 | 35233.000 | 40870.000 | 41907.000 | 38480.000 | 27595.000 | 46188.000 | 40584.000 | 40633.000 | 40960.000 | 44960.000 | 42965.000 | 41207.000 | 46639.000 | 45923.000 | 45408.00 | 50639.00 | 59328.00 | 19920.00 | 18864.00 | 32800.00 | 35520.00 | 28720.00 | 49253.00 | 44880.000 | 39760.000 | 42400.000 | 43200.000 | 36320.000 | 45360.000 | 40240.000 | 47680.000 | 41360.000 | 40320.000 | 39120.000 | 39680.000 | 42880.000 | 54320.000 | 45576.000 | 45200.000 | 43680.000 | 48800.000 | 43920.000 | 42640.000 | 47197.000 | AX |
| P409 | A | X | 20400.00 | 21840.00 | 25146.00 | 21712.00 | 21760.00 | 24000.00 | 18320.00 | 27642.00 | 23040.00 | 25760.00 | 23747.00 | 29156.00 | 26000.00 | 24319.00 | 24832.00 | 27330.00 | 23200.00 | 25920.00 | 21680.00 | 25280.00 | 25440.00 | 26880.00 | 25360.00 | 25920.00 | 24800.00 | 25680.00 | 25120.00 | 24880.00 | 25520.00 | 28240.00 | 26960.00 | 25440.00 | 28560.00 | 26640.00 | 28160.00 | 29076.00 | 26400.00 | 27583.00 | 26094.00 | 21585.00 | 31943.00 | 26720.00 | 26720.00 | 26320.00 | 34399.00 | 32881.00 | 11920.00 | 24080.00 | 26960.00 | 22400.00 | 25760.00 | 30464.00 | 29840.00 | 30080.00 | 36160.00 | 37024.00 | 38400.00 | 38000.00 | 34400.00 | 35520.00 | 38240.00 | 37920.00 | 33520.00 | 33200.00 | 35113.00 | 34016.00 | 37680.00 | 39520.00 | 34208.00 | 30240.00 | 34880.00 | 38880.00 | 30880.00 | 40320.00 | 35584.00 | 39736.00 | 18000.00 | 55439.00 | 32240.00 | 32640.00 | 35600.00 | 33277.00 | 40720.00 | 40880.00 | 32000.00 | 37360.00 | 37824.00 | 37232.00 | 31440.00 | 36480.00 | 31616.00 | 35440.00 | 32800.00 | 34720.00 | 34160.00 | 33755.00 | 27196.00 | 34000.00 | 32000.00 | 33008.00 | 32960.00 | 34800.00 | 28400.00 | 30240.00 | 38720.00 | 37600.00 | 39280.00 | 41600.00 | 39680.00 | 40960.00 | 37280.00 | 36960.00 | 42208.00 | 39840.00 | 43934.00 | 40640.00 | 33315.00 | 33280.00 | 38080.00 | 30480.00 | 45437.00 | 37920.00 | 35840.00 | 37840.00 | 36960.00 | 39360.00 | 44320.00 | 34480.00 | 35280.00 | 45600.00 | 33600.00 | 37520.00 | 40240.00 | 40560.00 | 30720.000 | 33760.000 | 32240.000 | 40800.000 | 37200.000 | 27040.0 | 36720.000 | 37040.000 | 31680.000 | 31200.000 | 35120.000 | 32720.000 | 34560.000 | 33996.000 | 34160.000 | 34880.000 | 30320.000 | 35360.000 | 36880.000 | 32800.000 | 23040.000 | 38320.000 | 37840.000 | 35232.000 | 37680.000 | 37760.000 | 36960.000 | 37386.000 | 41139.000 | 39390.000 | 42208.00 | 39840.00 | 43934.00 | 40640.00 | 33315.00 | 33280.00 | 38080.00 | 30480.00 | 45437.00 | 41166.000 | 31998.000 | 34150.000 | 37760.000 | 31600.000 | 39840.000 | 36400.000 | 41840.000 | 36720.000 | 37840.000 | 35200.000 | 34800.000 | 38720.000 | 48323.000 | 38584.000 | 41440.000 | 37440.000 | 43228.000 | 38400.000 | 37920.000 | 39360.000 | AX |
| P412 | A | X | 32380.66 | 33705.84 | 35460.67 | 40816.48 | 37575.16 | 35681.17 | 29089.50 | 41468.84 | 36511.83 | 37275.16 | 34339.34 | 37015.00 | 40604.33 | 41839.67 | 40765.84 | 42533.83 | 39231.84 | 41182.34 | 39479.16 | 40958.33 | 39907.67 | 42148.66 | 38769.16 | 40031.67 | 41710.33 | 36897.33 | 42139.00 | 39564.84 | 44896.50 | 42556.66 | 43840.99 | 40208.34 | 45042.67 | 44200.33 | 46525.83 | 45073.49 | 45870.33 | 43370.50 | 46192.00 | 43660.83 | 39593.49 | 43489.00 | 42475.16 | 39757.01 | 41702.00 | 45408.17 | 42857.67 | 39933.83 | 41226.83 | 42678.33 | 40095.17 | 45183.83 | 40546.16 | 49824.17 | 49549.00 | 47736.16 | 49407.83 | 48498.66 | 57045.00 | 50701.33 | 53587.30 | 53915.33 | 47398.50 | 46376.17 | 53185.33 | 47830.84 | 63615.67 | 52471.66 | 58605.50 | 60308.00 | 65955.17 | 57042.33 | 57246.00 | 56639.51 | 50003.66 | 57102.50 | 54986.17 | 56354.17 | 49948.00 | 48336.83 | 58998.17 | 47555.00 | 57523.84 | 53228.17 | 51371.50 | 52810.83 | 55649.33 | 52530.83 | 46600.67 | 55925.49 | 52592.85 | 52564.34 | 53322.00 | 53748.67 | 52638.34 | 49566.81 | 52796.17 | 50818.83 | 48771.33 | 51812.67 | 49761.00 | 51165.50 | 48161.67 | 48132.84 | 53287.33 | 53942.33 | 56326.50 | 58634.84 | 57563.35 | 60663.67 | 62008.67 | 57630.83 | 64344.15 | 68529.33 | 63358.67 | 61589.50 | 59295.65 | 50016.67 | 57857.83 | 58957.17 | 59568.33 | 54735.67 | 60350.83 | 58219.50 | 59426.17 | 55617.15 | 54574.66 | 57730.99 | 55134.16 | 58851.18 | 54032.50 | 55899.82 | 67135.83 | 58517.16 | 32987.000 | 48178.835 | 60092.834 | 64562.000 | 59212.669 | 58122.0 | 60216.001 | 57084.504 | 45387.670 | 56589.501 | 59117.167 | 52667.502 | 53820.002 | 56550.001 | 51125.168 | 53898.502 | 40176.668 | 64626.668 | 53761.834 | 53803.669 | 47184.335 | 43630.338 | 42673.839 | 51637.671 | 47629.672 | 49407.172 | 48703.001 | 48745.168 | 37149.337 | 42887.668 | 64344.15 | 68529.33 | 63358.67 | 61589.50 | 59295.65 | 50016.67 | 57857.83 | 58957.17 | 59568.33 | 60934.000 | 60822.002 | 57713.505 | 57129.336 | 49759.837 | 56634.336 | 54883.003 | 54946.837 | 54940.336 | 52795.001 | 48138.504 | 50397.670 | 53453.334 | 59114.670 | 55382.504 | 56187.001 | 52692.840 | 56846.502 | 54836.002 | 59670.501 | 54180.835 | AX |
| P417 | A | X | 36810.83 | 36460.00 | 40578.17 | 40549.82 | 37496.83 | 29850.17 | 38324.67 | 32876.68 | 39838.16 | 39680.66 | 35086.16 | 37488.67 | 41639.67 | 41173.50 | 46257.66 | 41438.01 | 38422.83 | 39417.84 | 40964.34 | 39920.33 | 39849.82 | 40655.00 | 39551.33 | 40477.83 | 41083.18 | 37884.01 | 42693.66 | 40837.16 | 43541.00 | 42852.34 | 44577.50 | 40906.01 | 45109.15 | 44338.84 | 44629.99 | 44359.66 | 46241.00 | 44359.34 | 45410.49 | 41637.01 | 40781.50 | 45547.01 | 44645.66 | 41757.51 | 42843.00 | 47402.50 | 43819.83 | 43437.81 | 44527.67 | 43391.33 | 43346.16 | 48926.66 | 44352.84 | 51774.49 | 51113.17 | 50584.85 | 52631.83 | 50265.17 | 58107.50 | 53591.99 | 55974.15 | 59263.33 | 48685.33 | 45905.16 | 54408.98 | 51902.50 | 70011.50 | 56369.33 | 65760.83 | 59423.17 | 66320.83 | 60513.33 | 58552.50 | 61686.02 | 53055.66 | 59556.50 | 62590.00 | 60664.32 | 53170.16 | 54812.66 | 58929.01 | 54409.67 | 63679.85 | 55474.84 | 50042.16 | 57217.84 | 57255.17 | 58062.83 | 47116.00 | 61546.83 | 53333.34 | 54221.67 | 55700.33 | 55818.83 | 54286.66 | 55018.49 | 53856.00 | 54992.50 | 52436.50 | 58120.83 | 53641.83 | 53801.00 | 50168.34 | 51761.33 | 57496.66 | 60555.00 | 60110.83 | 62720.16 | 65461.97 | 63010.50 | 66018.49 | 62752.50 | 68076.52 | 70437.83 | 65503.67 | 66899.50 | 63298.49 | 54999.83 | 64998.67 | 62926.00 | 62643.16 | 60296.83 | 65359.67 | 58854.33 | 65905.33 | 62388.98 | 62646.33 | 62427.66 | 63488.16 | 62767.83 | 62573.16 | 59886.65 | 73307.84 | 68932.84 | 42979.000 | 49596.003 | 66160.835 | 71957.000 | 63607.670 | 60848.0 | 69219.669 | 64916.840 | 57122.335 | 65064.834 | 59444.834 | 64374.001 | 57376.670 | 61931.001 | 54968.668 | 60923.002 | 53596.167 | 72524.001 | 58360.000 | 57247.836 | 53840.670 | 40530.669 | 38218.672 | 55919.673 | 53506.337 | 56369.340 | 54358.336 | 57714.669 | 41830.838 | 45828.336 | 68076.52 | 70437.83 | 65503.67 | 66899.50 | 63298.49 | 54999.83 | 64998.67 | 62926.00 | 62643.16 | 66653.000 | 63424.168 | 60873.673 | 61152.839 | 56422.668 | 61394.005 | 60184.671 | 57369.336 | 60843.001 | 57907.001 | 51760.504 | 55614.168 | 57896.501 | 62902.003 | 56828.004 | 56779.835 | 58217.839 | 61899.671 | 61147.169 | 62424.668 | 58954.503 | AX |
# Transpose to get dates as index and generate descriptive statistics
sales2_ax = sales2_ax.drop(columns = ['ABC', 'XYZ', 'vol_vol'])
s2_ax = sales2_ax.transpose()
s2_ax.index.set_names('Week', inplace = True)
s2_ax.index = pd.to_datetime(s2_ax.index)
s2_ax_describe = s2_ax.describe().applymap('{:,.0f}'.format)
sales2_bx = sales2_bx.drop(columns = ['ABC', 'XYZ', 'vol_vol'])
s2_bx = sales2_bx.transpose()
s2_bx.index.set_names('Week', inplace = True)
s2_bx.index = pd.to_datetime(s2_bx.index)
s2_bx_describe = s2_bx.describe().applymap('{:,.0f}'.format)
sales2_cx = sales2_cx.drop(columns = ['ABC', 'XYZ', 'vol_vol'])
s2_cx = sales2_cx.transpose()
s2_cx.index.set_names('Week', inplace = True)
s2_cx.index = pd.to_datetime(s2_cx.index)
s2_cx_describe = s2_cx.describe().applymap('{:,.0f}'.format)
sales2_cy = sales2_cy.drop(columns = ['ABC', 'XYZ', 'vol_vol'])
s2_cy = sales2_cy.transpose()
s2_cy.index.set_names('Week', inplace = True)
s2_cy.index = pd.to_datetime(s2_cy.index)
s2_cy_describe = s2_cy.describe().applymap('{:,.0f}'.format)
sales2_cz = sales2_cz.drop(columns = ['ABC', 'XYZ', 'vol_vol'])
s2_cz = sales2_cz.transpose()
s2_cz.index.set_names('Week', inplace = True)
s2_cz.index = pd.to_datetime(s2_cz.index)
s2_cz_describe = s2_cz.describe().applymap('{:,.0f}'.format)
sales2_np = sales2_np.drop(columns = ['ABC', 'XYZ', 'vol_vol'])
s2_np = sales2_np.transpose()
s2_np.index.set_names('Week', inplace = True)
s2_np.index = pd.to_datetime(s2_np.index)
s2_np_describe = s2_np.describe().applymap('{:,.0f}'.format)
s2_ax_describe
| Product Code | P387 | P388 | P390 | P391 | P394 | P407 | P408 | P409 | P412 | P417 |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 |
| mean | 61,530 | 64,403 | 91,948 | 105,076 | 28,753 | 28,287 | 36,198 | 33,445 | 50,761 | 54,099 |
| std | 9,261 | 8,314 | 13,863 | 14,383 | 8,036 | 4,753 | 8,488 | 6,506 | 8,192 | 9,652 |
| min | 40,428 | 42,826 | 55,053 | 62,964 | 9,757 | 9,680 | 12,320 | 11,920 | 29,090 | 29,850 |
| 25% | 56,230 | 58,761 | 83,102 | 95,000 | 20,173 | 24,560 | 29,278 | 28,280 | 43,706 | 44,634 |
| 50% | 61,320 | 64,047 | 91,993 | 105,145 | 31,766 | 28,628 | 37,480 | 34,184 | 52,501 | 55,760 |
| 75% | 66,989 | 69,468 | 100,507 | 112,357 | 34,411 | 31,302 | 41,360 | 37,900 | 57,098 | 61,923 |
| max | 95,232 | 87,968 | 134,032 | 148,292 | 44,219 | 44,226 | 63,840 | 55,439 | 68,529 | 73,308 |
s2_bx_describe
| Product Code | P385 | P386 | P389 | P392 | P393 | P405 | P406 | P440 |
|---|---|---|---|---|---|---|---|---|
| count | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 |
| mean | 14,640 | 17,374 | 23,897 | 15,931 | 15,673 | 7,903 | 18,193 | 8,382 |
| std | 2,894 | 3,118 | 3,378 | 3,849 | 2,968 | 1,753 | 2,885 | 2,058 |
| min | 8,282 | 9,530 | 15,158 | 7,774 | 8,540 | 1 | 6,560 | 2,880 |
| 25% | 12,447 | 15,408 | 22,008 | 13,536 | 13,665 | 6,960 | 16,190 | 7,040 |
| 50% | 14,647 | 17,448 | 24,119 | 16,397 | 15,884 | 8,160 | 18,240 | 8,240 |
| 75% | 16,853 | 19,539 | 25,929 | 18,695 | 17,614 | 8,960 | 20,316 | 9,820 |
| max | 22,108 | 25,234 | 33,721 | 24,220 | 23,934 | 11,659 | 29,680 | 14,960 |
s2_cx_describe
| Product Code | P401 | P402 | P410 | P415 | P416 | P418 | P421 | P422 | P424 | P426 | P430 | P437 | P438 | P439 | P441 | P442 | P447 | P452 | P453 | P454 | P455 | P457 | P458 | P459 | P460 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 175 | 175 | 175 | 175 | 161 | 161 | 161 | 161 |
| mean | 4,517 | 3,223 | 4,791 | 1,317 | 1,145 | 1,164 | 1,027 | 392 | 1,011 | 864 | 645 | 384 | 5,118 | 4,819 | 6,410 | 3,046 | 8,264 | 1,108 | 983 | 1,617 | 1,290 | 2,661 | 3,211 | 3,986 | 5,052 |
| std | 1,629 | 1,158 | 1,607 | 413 | 383 | 413 | 361 | 163 | 320 | 316 | 249 | 282 | 1,517 | 1,434 | 1,817 | 1,002 | 2,224 | 394 | 395 | 571 | 475 | 866 | 1,033 | 1,459 | 1,706 |
| min | 1 | 1 | 1 | 1 | 1 | 80 | 48 | 1 | 1 | 1 | 160 | 1 | 720 | 1,200 | 2,240 | 1 | 1,664 | 144 | 1 | 320 | 224 | 160 | 160 | 160 | 128 |
| 25% | 3,597 | 2,564 | 3,760 | 1,120 | 960 | 876 | 784 | 320 | 820 | 624 | 480 | 208 | 4,160 | 3,780 | 5,280 | 2,560 | 6,643 | 880 | 720 | 1,280 | 1,009 | 2,255 | 2,640 | 2,960 | 4,015 |
| 50% | 4,640 | 3,264 | 4,794 | 1,280 | 1,120 | 1,192 | 1,040 | 400 | 1,008 | 832 | 640 | 296 | 4,960 | 4,760 | 6,320 | 3,040 | 8,254 | 1,104 | 976 | 1,600 | 1,232 | 2,640 | 3,200 | 3,920 | 5,120 |
| 75% | 5,476 | 3,900 | 6,000 | 1,680 | 1,440 | 1,436 | 1,280 | 480 | 1,212 | 1,081 | 735 | 492 | 6,080 | 5,645 | 7,520 | 3,600 | 10,104 | 1,360 | 1,208 | 1,920 | 1,538 | 2,960 | 3,680 | 4,880 | 6,160 |
| max | 9,824 | 7,248 | 9,760 | 2,480 | 2,480 | 2,640 | 2,256 | 1,120 | 2,024 | 1,728 | 1,520 | 1,840 | 13,120 | 10,160 | 12,480 | 5,760 | 13,419 | 3,680 | 3,127 | 3,520 | 2,720 | 6,640 | 7,185 | 8,738 | 10,608 |
s2_cy_describe
| Product Code | P396 | P397 | P399 | P400 | P419 | P420 | P423 | P425 | P427 | P428 | P429 | P431 | P432 | P433 | P434 | P448 | P449 | P450 | P451 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 176 | 175 | 177 | 177 |
| mean | 707 | 1,603 | 1,912 | 1,090 | 1,243 | 610 | 360 | 614 | 395 | 551 | 502 | 708 | 974 | 850 | 864 | 2,227 | 2,140 | 4,204 | 3,149 |
| std | 334 | 652 | 774 | 485 | 447 | 257 | 188 | 264 | 161 | 213 | 198 | 305 | 356 | 327 | 342 | 1,038 | 931 | 1,701 | 1,368 |
| min | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 80 | 1 | 1 | 48 | 534 | 542 | 1,177 | 530 |
| 25% | 480 | 1,200 | 1,456 | 800 | 960 | 445 | 240 | 432 | 320 | 480 | 400 | 560 | 776 | 640 | 640 | 1,600 | 1,503 | 3,108 | 2,256 |
| 50% | 640 | 1,544 | 1,808 | 1,056 | 1,216 | 640 | 320 | 560 | 400 | 480 | 480 | 640 | 960 | 800 | 880 | 1,920 | 1,907 | 3,806 | 2,865 |
| 75% | 880 | 2,000 | 2,312 | 1,340 | 1,520 | 780 | 479 | 768 | 480 | 640 | 560 | 880 | 1,120 | 1,040 | 1,120 | 2,631 | 2,558 | 4,960 | 3,820 |
| max | 1,840 | 4,320 | 4,208 | 2,768 | 3,346 | 1,456 | 1,232 | 1,456 | 960 | 1,302 | 1,200 | 1,998 | 2,240 | 2,000 | 2,000 | 5,920 | 5,082 | 9,616 | 7,760 |
s2_cz_describe
| Product Code | P395 | P398 | P403 | P404 | P413 | P414 | P435 | P436 | P443 | P444 | P445 | P446 | P456 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 194 | 194 | 194 | 194 | 194 | 194 | 194 | 192 | 184 | 184 | 184 | 184 | 157 |
| mean | 730 | 1,276 | 8,465 | 7,501 | 550 | 480 | 362 | 515 | 1,294 | 1,697 | 1,889 | 851 | 444 |
| std | 394 | 595 | 4,098 | 4,175 | 199 | 199 | 191 | 711 | 803 | 744 | 1,172 | 414 | 381 |
| min | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 25% | 480 | 880 | 5,760 | 4,480 | 480 | 320 | 240 | 1 | 800 | 1,200 | 1,120 | 640 | 235 |
| 50% | 720 | 1,200 | 7,920 | 6,160 | 480 | 480 | 320 | 1 | 1,280 | 1,760 | 1,680 | 800 | 320 |
| 75% | 960 | 1,600 | 11,580 | 10,559 | 720 | 640 | 476 | 1,520 | 1,600 | 2,160 | 2,500 | 1,040 | 559 |
| max | 2,000 | 4,560 | 20,080 | 20,080 | 1,184 | 1,040 | 1,520 | 1,520 | 5,920 | 3,520 | 7,200 | 2,370 | 1,679 |
s2_np_describe
| Product Code | P411 | P461 | P462 | P463 | P464 | P465 | P466 | P467 | P468 | P469 | P470 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 36 | 89 | 89 | 90 | 90 | 82 | 49 | 49 | 49 | 49 | 49 |
| mean | 1,962 | 1,189 | 1,343 | 2,205 | 2,404 | 969 | 284 | 365 | 923 | 506 | 242 |
| std | 1,597 | 775 | 860 | 988 | 944 | 1,420 | 232 | 433 | 1,046 | 604 | 330 |
| min | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 25% | 640 | 1 | 1,512 | 1,520 | 1,520 | 1 | 80 | 1 | 224 | 80 | 1 |
| 50% | 1,560 | 1,520 | 1,520 | 1,520 | 3,040 | 374 | 256 | 240 | 592 | 352 | 160 |
| 75% | 2,580 | 1,520 | 1,520 | 3,040 | 3,040 | 1,440 | 480 | 560 | 1,040 | 672 | 320 |
| max | 7,920 | 3,040 | 3,040 | 4,560 | 4,560 | 8,800 | 800 | 1,872 | 4,932 | 2,800 | 1,460 |
plt.figure(figsize = (18,12))
plt.title('Segment AX')
for item in s2_ax.columns:
plt.plot(s2_ax.index, s2_ax[item], linestyle = '-')
plt.show()
plt.figure(figsize = (18,12))
plt.title('Segment BX')
for item in s2_bx.columns:
plt.plot(s2_bx.index, s2_bx[item], linestyle = '-')
plt.show()
plt.figure(figsize = (18,12))
plt.title('Segment CX')
for item in s2_cx.columns:
plt.plot(s2_cx.index, s2_cx[item], linestyle = '-')
plt.show()
plt.figure(figsize = (18,12))
plt.title('Segment CY')
for item in s2_cy.columns:
plt.plot(s2_cy.index, s2_cy[item], linestyle = '-')
plt.show()
plt.figure(figsize = (18,12))
plt.title('Segment CZ')
for item in s2_cz.columns:
plt.plot(s2_cz.index, s2_cz[item], linestyle = '-')
plt.show()
plt.figure(figsize = (18,12))
plt.title('Segment NP')
for item in s2_np.columns:
plt.plot(s2_np.index, s2_np[item], linestyle = '-')
plt.show()
bp_ax = s2_ax.boxplot(rot = 90, figsize = (15,10))
bp_ax.set_title('Segment AX', size = 20)
bp_ax.set_xlabel('Product Code', size = 15)
bp_ax.set_ylabel('Weekly Cases', size = 15)
bp_ax
<AxesSubplot:title={'center':'Segment AX'}, xlabel='Product Code', ylabel='Weekly Cases'>
bp_bx = s2_bx.boxplot(rot = 90, figsize = (15,10))
bp_bx.set_title('Segment BX', size = 20)
bp_bx.set_xlabel('Product Code', size = 15)
bp_bx.set_ylabel('Weekly Cases', size = 15)
bp_bx
<AxesSubplot:title={'center':'Segment BX'}, xlabel='Product Code', ylabel='Weekly Cases'>
bp_cx = s2_cx.boxplot(rot = 90, figsize = (15,10))
bp_cx.set_title('Segment CX', size = 20)
bp_cx.set_xlabel('Product Code', size = 15)
bp_cx.set_ylabel('Weekly Cases', size = 15)
bp_cx
<AxesSubplot:title={'center':'Segment CX'}, xlabel='Product Code', ylabel='Weekly Cases'>
bp_cy = s2_cy.boxplot(rot = 90, figsize = (15,10))
bp_cy.set_title('Segment CY', size = 20)
bp_cy.set_xlabel('Product Code', size = 15)
bp_cy.set_ylabel('Weekly Cases', size = 15)
bp_cy
<AxesSubplot:title={'center':'Segment CY'}, xlabel='Product Code', ylabel='Weekly Cases'>
bp_cz = s2_cz.boxplot(rot = 90, figsize = (15,10))
bp_cz.set_title('Segment CZ', size = 20)
bp_cz.set_xlabel('Product Code', size = 15)
bp_cz.set_ylabel('Weekly Cases', size = 15)
bp_cz
<AxesSubplot:title={'center':'Segment CZ'}, xlabel='Product Code', ylabel='Weekly Cases'>
bp_np = s2_np.boxplot(rot = 90, figsize = (15,10))
bp_np.set_title('Segment NP', size = 20)
bp_np.set_xlabel('Product Code', size = 15)
bp_np.set_ylabel('Weekly Cases', size = 15)
bp_np
<AxesSubplot:title={'center':'Segment NP'}, xlabel='Product Code', ylabel='Weekly Cases'>
ax_train = s2_bx.iloc[:-13, :]
ax_test = s2_bx.iloc[-13:, :]
ax_results_rows = []
ax_param_rows = []
pred_ax2 = ax_test
for product in ax_train.columns:
triple = ExponentialSmoothing(ax_train[product], trend="add", seasonal="add", seasonal_periods=52, freq = 'W-SAT', missing = 'drop', damped_trend=True, initialization_method = "estimated").fit()
triple_label = product + "_triple"
pred_ax2[triple_label] = triple.forecast(13)
double = Holt(ax_train[product], exponential = False, damped_trend=True, initialization_method = "estimated").fit()
double_label = product + "_double"
pred_ax2[double_label] = double.forecast(13)
single = SimpleExpSmoothing(ax_train[product], initialization_method = "estimated").fit()
single_label = product + "_single"
pred_ax2[single_label] = single.forecast(13)
#Make results tables
triple_mape = mape(pred_ax2[product], pred_ax2[triple_label])
triple_rmse = rmse(pred_ax2[product], pred_ax2[triple_label])
triple_alpha = triple.params['smoothing_level']
triple_beta = triple.params['smoothing_trend']
triple_gamma = triple.params['smoothing_seasonal']
triple_phi = triple.params['damping_trend']
double_mape = mape(pred_ax2[product], pred_ax2[double_label])
double_rmse = rmse(pred_ax2[product], pred_ax2[double_label])
double_alpha = double.params['smoothing_level']
double_beta = double.params['smoothing_trend']
double_phi = double.params['damping_trend']
single_mape = mape(pred_ax2[product], pred_ax2[single_label])
single_rmse = rmse(pred_ax2[product], pred_ax2[single_label])
single_alpha = single.params['smoothing_level']
ax_results_rows.append([product, single_mape, double_mape, triple_mape])
ax_param_rows.append([product, single_alpha, double_alpha, double_beta, double_phi, triple_alpha, triple_beta, triple_gamma, triple_phi])
fig, (ax1,ax2) = plt.subplots(nrows = 2, ncols = 1, figsize = (16,12))
ax1.plot(ax_train[product], label = 'Training', color = 'blue')
ax1.plot(pred_ax2[product], label = 'Test', color = 'orange')
ax1.plot(pred_ax2[triple_label], label = 'Triple Exponential Smoothing', color = 'red', linestyle = '--')
ax1.plot(pred_ax2[double_label], label = 'Double Exponential Smoothing', color = 'green', linestyle = '-.')
ax1.plot(pred_ax2[single_label], label = 'Single Exponential Smoothing', color = 'black', linestyle = ':')
ax1.legend(loc = 'best')
ax1.set_xlabel('Sales Week')
ax1.set_ylabel('Cases of Product '+product)
ax1.axvspan('2022-07-02', '2022-09-24', color = 'gray', alpha = 0.25)
ax1.set_title(product + ' Sales & Forecast')
ax2.plot(pred_ax2[product], label = "Actual Cases", color = 'orange')
ax2.plot(pred_ax2[triple_label], label = f'Triple Exponential Smoothing, MAPE = {triple_mape}%', color = 'red', linestyle = '--')
ax2.plot(pred_ax2[double_label], label = f'Double Exponential Smoothing, MAPE = {double_mape}%', color = 'green', linestyle = '-.')
ax2.plot(pred_ax2[single_label], label = f'Single Exponential Smoothing, MAPE = {single_mape}%', color = 'black', linestyle = ':')
ax2.legend(loc = 'best')
ax2.set_xlabel('Sales Week')
ax2.set_ylabel('Cases of Product '+product)
ax2.set_title(product + ' Forecast vs Actual')
#ax2.text(0.5, 0.05, f'Triple Exponential Smoothing MAPE for {product} is {triple_mape}%\nDouble Exponential Smoothing MAPE for {product} is {double_mape}%' ,
#verticalalignment='bottom', horizontalalignment='center',
#transform=ax2.transAxes,
#color='black', fontsize=10)
plt.tight_layout()
smoothing_level = triple.params['smoothing_level']
smoothing_trend = triple.params['smoothing_trend']
smoothing_seasonal = triple.params['smoothing_seasonal']
ax_results = pd.DataFrame(ax_results_rows, columns = ['Product Code', 'MAPE - Single', 'MAPE - Double', 'MAPE - Triple'])
ax_params = pd.DataFrame(ax_param_rows, columns = ['Product Code', 'Alpha - Single', 'Alpha - Double', 'Beta - Double', 'Phi - Double', 'Alpha - Triple', 'Beta - Triple', 'Gamma - Triple', 'Phi - Triple'])
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-27-6751c3e4be8d>:11: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_ax2[triple_label] = triple.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-27-6751c3e4be8d>:14: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_ax2[double_label] = double.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-27-6751c3e4be8d>:17: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_ax2[single_label] = single.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
bx_train = s2_bx.iloc[:-13, :]
bx_test = s2_bx.iloc[-13:, :]
bx_results_rows = []
bx_param_rows = []
pred_bx2 = bx_test
for product in bx_train.columns:
triple = ExponentialSmoothing(bx_train[product], trend="add", seasonal="add", seasonal_periods=52, freq = 'W-SAT', missing = 'drop', damped_trend=True, initialization_method = "estimated").fit()
triple_label = product + "_triple"
pred_bx2[triple_label] = triple.forecast(13)
double = Holt(bx_train[product], exponential = False, damped_trend=True, initialization_method = "estimated").fit()
double_label = product + "_double"
pred_bx2[double_label] = double.forecast(13)
single = SimpleExpSmoothing(bx_train[product], initialization_method = "estimated").fit()
single_label = product + "_single"
pred_bx2[single_label] = single.forecast(13)
#Make results tables
triple_mape = mape(pred_bx2[product], pred_bx2[triple_label])
triple_rmse = rmse(pred_bx2[product], pred_bx2[triple_label])
triple_alpha = triple.params['smoothing_level']
triple_beta = triple.params['smoothing_trend']
triple_gamma = triple.params['smoothing_seasonal']
triple_phi = triple.params['damping_trend']
double_mape = mape(pred_bx2[product], pred_bx2[double_label])
double_rmse = rmse(pred_bx2[product], pred_bx2[double_label])
double_alpha = double.params['smoothing_level']
double_beta = double.params['smoothing_trend']
double_phi = double.params['damping_trend']
single_mape = mape(pred_bx2[product], pred_bx2[single_label])
single_rmse = rmse(pred_bx2[product], pred_bx2[single_label])
single_alpha = single.params['smoothing_level']
bx_results_rows.append([product, single_mape, double_mape, triple_mape])
bx_param_rows.append([product, single_alpha, double_alpha, double_beta, double_phi, triple_alpha, triple_beta, triple_gamma, triple_phi])
fig, (bx1,bx2) = plt.subplots(nrows = 2, ncols = 1, figsize = (16,12))
bx1.plot(bx_train[product], label = 'Training', color = 'blue')
bx1.plot(pred_bx2[product], label = 'Test', color = 'orange')
bx1.plot(pred_bx2[triple_label], label = 'Triple Exponential Smoothing', color = 'red', linestyle = '--')
bx1.plot(pred_bx2[double_label], label = 'Double Exponential Smoothing', color = 'green', linestyle = '-.')
bx1.plot(pred_bx2[single_label], label = 'Single Exponential Smoothing', color = 'black', linestyle = ':')
bx1.legend(loc = 'best')
bx1.set_xlabel('Sales Week')
bx1.set_ylabel('Cases of Product '+product)
bx1.axvspan('2022-07-02', '2022-09-24', color = 'gray', alpha = 0.25)
bx1.set_title(product + ' Sales & Forecast')
bx2.plot(pred_bx2[product], label = "Actual Cases", color = 'orange')
bx2.plot(pred_bx2[triple_label], label = f'Triple Exponential Smoothing, MAPE = {triple_mape}%', color = 'red', linestyle = '--')
bx2.plot(pred_bx2[double_label], label = f'Double Exponential Smoothing, MAPE = {double_mape}%', color = 'green', linestyle = '-.')
bx2.plot(pred_bx2[single_label], label = f'Single Exponential Smoothing, MAPE = {single_mape}%', color = 'black', linestyle = ':')
bx2.legend(loc = 'best')
bx2.set_xlabel('Sales Week')
bx2.set_ylabel('Cases of Product '+product)
bx2.set_title(product + ' Forecast vs Actual')
#bx2.text(0.5, 0.05, f'Triple Exponential Smoothing MAPE for {product} is {triple_mape}%\nDouble Exponential Smoothing MAPE for {product} is {double_mape}%' ,
#verticalalignment='bottom', horizontalalignment='center',
#transform=bx2.transAxes,
#color='black', fontsize=10)
plt.tight_layout()
smoothing_level = triple.params['smoothing_level']
smoothing_trend = triple.params['smoothing_trend']
smoothing_seasonal = triple.params['smoothing_seasonal']
bx_results = pd.DataFrame(bx_results_rows, columns = ['Product Code', 'MAPE - Single', 'MAPE - Double', 'MAPE - Triple'])
bx_params = pd.DataFrame(bx_param_rows, columns = ['Product Code', 'Alpha - Single', 'Alpha - Double', 'Beta - Double', 'Phi - Double', 'Alpha - Triple', 'Beta - Triple', 'Gamma - Triple', 'Phi - Triple'])
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-28-26600efd4b0a>:11: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_bx2[triple_label] = triple.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-28-26600efd4b0a>:14: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_bx2[double_label] = double.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-28-26600efd4b0a>:17: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_bx2[single_label] = single.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
cx_train = s2_cx.iloc[:-13, :]
cx_test = s2_cx.iloc[-13:, :]
cx_results_rows = []
cx_param_rows = []
pred_cx2 = cx_test
for product in cx_train.columns:
triple = ExponentialSmoothing(cx_train[product].iloc[40:], trend="add", seasonal="add", seasonal_periods=52, freq = 'W-SAT', missing = 'drop', damped_trend=True, initialization_method = "estimated").fit()
triple_label = product + "_triple"
pred_cx2[triple_label] = triple.forecast(13)
double = Holt(cx_train[product].iloc[40:], exponential = False, damped_trend=True, initialization_method = "estimated").fit()
double_label = product + "_double"
pred_cx2[double_label] = double.forecast(13)
single = SimpleExpSmoothing(cx_train[product].iloc[40:], initialization_method = "estimated").fit()
single_label = product + "_single"
pred_cx2[single_label] = single.forecast(13)
#Make results tables
triple_mape = mape(pred_cx2[product], pred_cx2[triple_label])
triple_rmse = rmse(pred_cx2[product], pred_cx2[triple_label])
triple_alpha = triple.params['smoothing_level']
triple_beta = triple.params['smoothing_trend']
triple_gamma = triple.params['smoothing_seasonal']
triple_phi = triple.params['damping_trend']
double_mape = mape(pred_cx2[product], pred_cx2[double_label])
double_rmse = rmse(pred_cx2[product], pred_cx2[double_label])
double_alpha = double.params['smoothing_level']
double_beta = double.params['smoothing_trend']
double_phi = double.params['damping_trend']
single_mape = mape(pred_cx2[product], pred_cx2[single_label])
single_rmse = rmse(pred_cx2[product], pred_cx2[single_label])
single_alpha = single.params['smoothing_level']
cx_results_rows.append([product, single_mape, double_mape, triple_mape])
cx_param_rows.append([product, single_alpha, double_alpha, double_beta, double_phi, triple_alpha, triple_beta, triple_gamma, triple_phi])
fig, (cx1,cx2) = plt.subplots(nrows = 2, ncols = 1, figsize = (16,12))
cx1.plot(cx_train[product], label = 'Training', color = 'blue')
cx1.plot(pred_cx2[product], label = 'Test', color = 'orange')
cx1.plot(pred_cx2[triple_label], label = 'Triple Exponential Smoothing', color = 'red', linestyle = '--')
cx1.plot(pred_cx2[double_label], label = 'Double Exponential Smoothing', color = 'green', linestyle = '-.')
cx1.plot(pred_cx2[single_label], label = 'Single Exponential Smoothing', color = 'black', linestyle = ':')
cx1.legend(loc = 'best')
cx1.set_xlabel('Sales Week')
cx1.set_ylabel('Cases of Product '+product)
cx1.axvspan('2022-07-02', '2022-09-24', color = 'gray', alpha = 0.25)
cx1.set_title(product + ' Sales & Forecast')
cx2.plot(pred_cx2[product], label = "Actual Cases", color = 'orange')
cx2.plot(pred_cx2[triple_label], label = f'Triple Exponential Smoothing, MAPE = {triple_mape}%', color = 'red', linestyle = '--')
cx2.plot(pred_cx2[double_label], label = f'Double Exponential Smoothing, MAPE = {double_mape}%', color = 'green', linestyle = '-.')
cx2.plot(pred_cx2[single_label], label = f'Single Exponential Smoothing, MAPE = {single_mape}%', color = 'black', linestyle = ':')
cx2.legend(loc = 'best')
cx2.set_xlabel('Sales Week')
cx2.set_ylabel('Cases of Product '+product)
cx2.set_title(product + ' Forecast vs Actual')
#cx2.text(0.5, 0.05, f'Triple Exponential Smoothing MAPE for {product} is {triple_mape}%\nDouble Exponential Smoothing MAPE for {product} is {double_mape}%' ,
#verticalalignment='bottom', horizontalalignment='center',
#transform=cx2.transAxes,
#color='black', fontsize=10)
plt.tight_layout()
smoothing_level = triple.params['smoothing_level']
smoothing_trend = triple.params['smoothing_trend']
smoothing_seasonal = triple.params['smoothing_seasonal']
cx_results = pd.DataFrame(cx_results_rows, columns = ['Product Code', 'MAPE - Single', 'MAPE - Double', 'MAPE - Triple'])
cx_params = pd.DataFrame(cx_param_rows, columns = ['Product Code', 'Alpha - Single', 'Alpha - Double', 'Beta - Double', 'Phi - Double', 'Alpha - Triple', 'Beta - Triple', 'Gamma - Triple', 'Phi - Triple'])
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-29-be6115694be4>:11: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cx2[triple_label] = triple.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-29-be6115694be4>:14: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cx2[double_label] = double.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-29-be6115694be4>:17: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cx2[single_label] = single.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-29-be6115694be4>:37: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`).
fig, (cx1,cx2) = plt.subplots(nrows = 2, ncols = 1, figsize = (16,12))
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
cy_train = s2_cy.iloc[:-13, :]
cy_test = s2_cy.iloc[-13:, :]
cy_results_rows = []
cy_param_rows = []
pred_cy2 = cy_test
for product in cy_train.columns:
triple = ExponentialSmoothing(cy_train[product].iloc[20:], trend="add", seasonal="add", seasonal_periods=52, freq = 'W-SAT', missing = 'drop', damped_trend=True, initialization_method = "estimated").fit()
triple_label = product + "_triple"
pred_cy2[triple_label] = triple.forecast(13)
double = Holt(cy_train[product].iloc[20:], exponential = False, damped_trend=True, initialization_method = "estimated").fit()
double_label = product + "_double"
pred_cy2[double_label] = double.forecast(13)
single = SimpleExpSmoothing(cy_train[product].iloc[20:], initialization_method = "estimated").fit()
single_label = product + "_single"
pred_cy2[single_label] = single.forecast(13)
#Make results tables
triple_mape = mape(pred_cy2[product], pred_cy2[triple_label])
triple_rmse = rmse(pred_cy2[product], pred_cy2[triple_label])
triple_alpha = triple.params['smoothing_level']
triple_beta = triple.params['smoothing_trend']
triple_gamma = triple.params['smoothing_seasonal']
triple_phi = triple.params['damping_trend']
double_mape = mape(pred_cy2[product], pred_cy2[double_label])
double_rmse = rmse(pred_cy2[product], pred_cy2[double_label])
double_alpha = double.params['smoothing_level']
double_beta = double.params['smoothing_trend']
double_phi = double.params['damping_trend']
single_mape = mape(pred_cy2[product], pred_cy2[single_label])
single_rmse = rmse(pred_cy2[product], pred_cy2[single_label])
single_alpha = single.params['smoothing_level']
cy_results_rows.append([product, single_mape, double_mape, triple_mape])
cy_param_rows.append([product, single_alpha, double_alpha, double_beta, double_phi, triple_alpha, triple_beta, triple_gamma, triple_phi])
fig, (cy1,cy2) = plt.subplots(nrows = 2, ncols = 1, figsize = (16,12))
cy1.plot(cy_train[product], label = 'Training', color = 'blue')
cy1.plot(pred_cy2[product], label = 'Test', color = 'orange')
cy1.plot(pred_cy2[triple_label], label = 'Triple Exponential Smoothing', color = 'red', linestyle = '--')
cy1.plot(pred_cy2[double_label], label = 'Double Exponential Smoothing', color = 'green', linestyle = '-.')
cy1.plot(pred_cy2[single_label], label = 'Single Exponential Smoothing', color = 'black', linestyle = ':')
cy1.legend(loc = 'best')
cy1.set_xlabel('Sales Week')
cy1.set_ylabel('Cases of Product '+product)
cy1.axvspan('2022-07-02', '2022-09-24', color = 'gray', alpha = 0.25)
cy1.set_title(product + ' Sales & Forecast')
cy2.plot(pred_cy2[product], label = "Actual Cases", color = 'orange')
cy2.plot(pred_cy2[triple_label], label = f'Triple Exponential Smoothing, MAPE = {triple_mape}%', color = 'red', linestyle = '--')
cy2.plot(pred_cy2[double_label], label = f'Double Exponential Smoothing, MAPE = {double_mape}%', color = 'green', linestyle = '-.')
cy2.plot(pred_cy2[single_label], label = f'Single Exponential Smoothing, MAPE = {single_mape}%', color = 'black', linestyle = ':')
cy2.legend(loc = 'best')
cy2.set_xlabel('Sales Week')
cy2.set_ylabel('Cases of Product '+product)
cy2.set_title(product + ' Forecast vs Actual')
#cy2.text(0.5, 0.05, f'Triple Exponential Smoothing MAPE for {product} is {triple_mape}%\nDouble Exponential Smoothing MAPE for {product} is {double_mape}%' ,
#verticalalignment='bottom', horizontalalignment='center',
#transform=cy2.transAxes,
#color='black', fontsize=10)
plt.tight_layout()
smoothing_level = triple.params['smoothing_level']
smoothing_trend = triple.params['smoothing_trend']
smoothing_seasonal = triple.params['smoothing_seasonal']
cy_results = pd.DataFrame(cy_results_rows, columns = ['Product Code', 'MAPE - Single', 'MAPE - Double', 'MAPE - Triple'])
cy_params = pd.DataFrame(cy_param_rows, columns = ['Product Code', 'Alpha - Single', 'Alpha - Double', 'Beta - Double', 'Phi - Double', 'Alpha - Triple', 'Beta - Triple', 'Gamma - Triple', 'Phi - Triple'])
<ipython-input-30-d99ae18bd186>:11: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cy2[triple_label] = triple.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-30-d99ae18bd186>:14: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cy2[double_label] = double.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-30-d99ae18bd186>:17: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cy2[single_label] = single.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
cz_train = s2_cz.iloc[:-13, :]
cz_test = s2_cz.iloc[-13:, :]
cz_results_rows = []
cz_param_rows = []
pred_cz2 = cz_test
for product in cz_train.columns:
triple = ExponentialSmoothing(cz_train[product].iloc[40:], trend="add", seasonal="add", seasonal_periods=52, freq = 'W-SAT', missing = 'drop', damped_trend=True, initialization_method = "estimated").fit()
triple_label = product + "_triple"
pred_cz2[triple_label] = triple.forecast(13)
double = Holt(cz_train[product].iloc[40:], exponential = False, damped_trend=True, initialization_method = "estimated").fit()
double_label = product + "_double"
pred_cz2[double_label] = double.forecast(13)
single = SimpleExpSmoothing(cz_train[product].iloc[40:], initialization_method = "estimated").fit()
single_label = product + "_single"
pred_cz2[single_label] = single.forecast(13)
#Make results tables
triple_mape = mape(pred_cz2[product], pred_cz2[triple_label])
triple_rmse = rmse(pred_cz2[product], pred_cz2[triple_label])
triple_alpha = triple.params['smoothing_level']
triple_beta = triple.params['smoothing_trend']
triple_gamma = triple.params['smoothing_seasonal']
triple_phi = triple.params['damping_trend']
double_mape = mape(pred_cz2[product], pred_cz2[double_label])
double_rmse = rmse(pred_cz2[product], pred_cz2[double_label])
double_alpha = double.params['smoothing_level']
double_beta = double.params['smoothing_trend']
double_phi = double.params['damping_trend']
single_mape = mape(pred_cz2[product], pred_cz2[single_label])
single_rmse = rmse(pred_cz2[product], pred_cz2[single_label])
single_alpha = single.params['smoothing_level']
cz_results_rows.append([product, single_mape, double_mape, triple_mape])
cz_param_rows.append([product, single_alpha, double_alpha, double_beta, double_phi, triple_alpha, triple_beta, triple_gamma, triple_phi])
fig, (cz1,cz2) = plt.subplots(nrows = 2, ncols = 1, figsize = (16,12))
cz1.plot(cz_train[product], label = 'Training', color = 'blue')
cz1.plot(pred_cz2[product], label = 'Test', color = 'orange')
cz1.plot(pred_cz2[triple_label], label = 'Triple Exponential Smoothing', color = 'red', linestyle = '--')
cz1.plot(pred_cz2[double_label], label = 'Double Exponential Smoothing', color = 'green', linestyle = '-.')
cz1.plot(pred_cz2[single_label], label = 'Single Exponential Smoothing', color = 'black', linestyle = ':')
cz1.legend(loc = 'best')
cz1.set_xlabel('Sales Week')
cz1.set_ylabel('Cases of Product '+product)
cz1.axvspan('2022-07-02', '2022-09-24', color = 'gray', alpha = 0.25)
cz1.set_title(product + ' Sales & Forecast')
cz2.plot(pred_cz2[product], label = "Actual Cases", color = 'orange')
cz2.plot(pred_cz2[triple_label], label = f'Triple Exponential Smoothing, MAPE = {triple_mape}%', color = 'red', linestyle = '--')
cz2.plot(pred_cz2[double_label], label = f'Double Exponential Smoothing, MAPE = {double_mape}%', color = 'green', linestyle = '-.')
cz2.plot(pred_cz2[single_label], label = f'Single Exponential Smoothing, MAPE = {single_mape}%', color = 'black', linestyle = ':')
cz2.legend(loc = 'best')
cz2.set_xlabel('Sales Week')
cz2.set_ylabel('Cases of Product '+product)
cz2.set_title(product + ' Forecast vs Actual')
#cz2.text(0.5, 0.05, f'Triple Exponential Smoothing MAPE for {product} is {triple_mape}%\nDouble Exponential Smoothing MAPE for {product} is {double_mape}%' ,
#verticalalignment='bottom', horizontalalignment='center',
#transform=cz2.transAxes,
#color='black', fontsize=10)
plt.tight_layout()
smoothing_level = triple.params['smoothing_level']
smoothing_trend = triple.params['smoothing_trend']
smoothing_seasonal = triple.params['smoothing_seasonal']
#print(f'For product {product}:\n Single Smoothing:\n MAPE: {single_mape}%\n RMSE: {single_rmse}\n Double Smoothing:\n MAPE: {double_mape}%\n RMSE: {double_rmse}\n Triple Smoothing:\n MAPE: {triple_mape}%\n RMSE: {triple_rmse}')
#print(f'Alpha for {product} is {smoothing_level}')
#print(f'Beta for {product} is {smoothing_trend}')
#print(f'Gamma for {product} is {smoothing_seasonal}')
cz_results = pd.DataFrame(cz_results_rows, columns = ['Product Code', 'MAPE - Single', 'MAPE - Double', 'MAPE - Triple'])
cz_params = pd.DataFrame(cz_param_rows, columns = ['Product Code', 'Alpha - Single', 'Alpha - Double', 'Beta - Double', 'Phi - Double', 'Alpha - Triple', 'Beta - Triple', 'Gamma - Triple', 'Phi - Triple'])
<ipython-input-31-639d9f6b3068>:11: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cz2[triple_label] = triple.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-31-639d9f6b3068>:14: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cz2[double_label] = double.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-31-639d9f6b3068>:17: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_cz2[single_label] = single.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
np_train = s2_np.iloc[:-13, :]
np_test = s2_np.iloc[-13:, :]
np_results_rows = []
np_param_rows = []
pred_np2 = np_test
for product in np_train.columns:
#np_train[product] = np.where(np_train[product] < 1, 1, np_train[product])
#np_train[product] = np_train[product].fillna(1)
#triple = ExponentialSmoothing(np_train[product].iloc[158:], trend="add", seasonal="add", seasonal_periods=52, freq = 'W-SAT', missing = 'drop', damped_trend=True, initialization_method = "estimated").fit()
#triple_label = product + "_triple"
#pred_np2[triple_label] = triple.forecast(13)
double = Holt(np_train[product].iloc[158:], exponential = False, damped_trend=True, initialization_method = "estimated").fit()
double_label = product + "_double"
pred_np2[double_label] = double.forecast(13)
single = SimpleExpSmoothing(np_train[product].iloc[158:], initialization_method = "estimated").fit()
single_label = product + "_single"
pred_np2[single_label] = single.forecast(13)
#Make results tables
#triple_mape = mape(pred_np2[product], pred_np2[triple_label])
#triple_rmse = rmse(pred_np2[product], pred_np2[triple_label])
#triple_alpha = triple.params['smoothing_level']
#triple_beta = triple.params['smoothing_trend']
#triple_gamma = triple.params['smoothing_seasonal']
#triple_phi = triple.params['damping_trend']
double_mape = mape(pred_np2[product], pred_np2[double_label])
double_rmse = rmse(pred_np2[product], pred_np2[double_label])
double_alpha = double.params['smoothing_level']
double_beta = double.params['smoothing_trend']
double_phi = double.params['damping_trend']
single_mape = mape(pred_np2[product], pred_np2[single_label])
single_rmse = rmse(pred_np2[product], pred_np2[single_label])
single_alpha = single.params['smoothing_level']
np_results_rows.append([product, single_mape, double_mape])
np_param_rows.append([product, single_alpha, double_alpha, double_beta, double_phi])
fig, (np1,np2) = plt.subplots(nrows = 2, ncols = 1, figsize = (16,12))
np1.plot(np_train[product], label = 'Training', color = 'blue')
np1.plot(pred_np2[product], label = 'Test', color = 'orange')
#np1.plot(pred_np2[triple_label], label = 'Triple Exponential Smoothing', color = 'red', linestyle = '--')
np1.plot(pred_np2[double_label], label = 'Double Exponential Smoothing', color = 'green', linestyle = '-.')
np1.plot(pred_np2[single_label], label = 'Single Exponential Smoothing', color = 'black', linestyle = ':')
np1.legend(loc = 'best')
np1.set_xlabel('Sales Week')
np1.set_ylabel('Cases of Product '+product)
np1.axvspan('2022-07-02', '2022-09-24', color = 'gray', alpha = 0.25)
np1.set_title(product + ' Sales & Forecast')
np2.plot(pred_np2[product], label = "Actual Cases", color = 'orange')
#np2.plot(pred_np2[triple_label], label = f'Triple Exponential Smoothing, MAPE = {triple_mape}%', color = 'red', linestyle = '--')
np2.plot(pred_np2[double_label], label = f'Double Exponential Smoothing, MAPE = {double_mape}%', color = 'green', linestyle = '-.')
np2.plot(pred_np2[single_label], label = f'Single Exponential Smoothing, MAPE = {single_mape}%', color = 'black', linestyle = ':')
np2.legend(loc = 'best')
np2.set_xlabel('Sales Week')
np2.set_ylabel('Cases of Product '+product)
np2.set_title(product + ' Forecast vs Actual')
#np2.text(0.5, 0.05, f'Triple Exponential Smoothing MAPE for {product} is {triple_mape}%\nDouble Exponential Smoothing MAPE for {product} is {double_mape}%' ,
#verticalalignment='bottom', horizontalalignment='center',
#transform=np2.transAxes,
#color='black', fontsize=10)
plt.tight_layout()
#smoothing_level = triple.params['smoothing_level']
#smoothing_trend = triple.params['smoothing_trend']
#smoothing_seasonal = triple.params['smoothing_seasonal']
#print(f'For product {product}:\n Single Smoothing:\n MAPE: {single_mape}%\n RMSE: {single_rmse}\n Double Smoothing:\n MAPE: {double_mape}%\n RMSE: {double_rmse}\n Triple Smoothing:\n MAPE: {triple_mape}%\n RMSE: {triple_rmse}')
#print(f'Alpha for {product} is {smoothing_level}')
#print(f'Beta for {product} is {smoothing_trend}')
#print(f'Gamma for {product} is {smoothing_seasonal}')
np_results = pd.DataFrame(np_results_rows, columns = ['Product Code', 'MAPE - Single', 'MAPE - Double'])
np_params = pd.DataFrame(np_param_rows, columns = ['Product Code', 'Alpha - Single', 'Alpha - Double', 'Beta - Double', 'Phi - Double'])
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\holtwinters\model.py:920: ConvergenceWarning: Optimization failed to converge. Check mle_retvals.
warnings.warn(
<ipython-input-32-e569c0a0be80>:16: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_np2[double_label] = double.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
<ipython-input-32-e569c0a0be80>:19: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
pred_np2[single_label] = single.forecast(13)
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
C:\Users\Mike\anaconda3\lib\site-packages\statsmodels\tsa\base\tsa_model.py:524: ValueWarning: No frequency information was provided, so inferred frequency W-SAT will be used.
warnings.warn('No frequency information was'
#Set index column for all segments
ax_results.set_index(['Product Code'], inplace = True)
bx_results.set_index(['Product Code'], inplace = True)
cx_results.set_index(['Product Code'], inplace = True)
cy_results.set_index(['Product Code'], inplace = True)
cz_results.set_index(['Product Code'], inplace = True)
np_results.set_index(['Product Code'], inplace = True)
# Graph
plt.figure(figsize = (18,12))
plt.plot(ax_results.index, ax_results['MAPE - Single'], label = 'Single Exp Smoothing', color = 'blue', marker = 'o')
plt.plot(ax_results.index, ax_results['MAPE - Double'], label = 'Double Exp Smoothing', color = 'orange', marker = 'x')
plt.plot(ax_results.index, ax_results['MAPE - Triple'], label = 'Triple Exp Smoothing', color = 'green', marker = '^')
plt.xlabel('Product Code', size = 14)
plt.ylabel('Mean Abs Percent Error (%)', size = 14)
plt.legend(loc = 'best')
plt.title('Segment AX Mean Absolute Percent Accuracy by Product', size = 20)
plt.show()
# Table of Values
ax_results
| MAPE - Single | MAPE - Double | MAPE - Triple | |
|---|---|---|---|
| Product Code | |||
| P385 | 6.8 | 6.6 | 11.0 |
| P386 | 13.2 | 9.7 | 22.3 |
| P389 | 5.7 | 4.2 | 6.3 |
| P392 | 23.3 | 12.7 | 25.0 |
| P393 | 7.8 | 8.0 | 9.2 |
| P405 | 7.6 | 7.4 | 18.4 |
| P406 | 5.9 | 5.9 | 9.5 |
| P440 | 21.2 | 21.3 | 22.8 |
# Parameters
ax_params.set_index(['Product Code'], inplace = True)
ax_params.applymap('{:,.4f}'.format)
| Alpha - Single | Alpha - Double | Beta - Double | Phi - Double | Alpha - Triple | Beta - Triple | Gamma - Triple | Phi - Triple | |
|---|---|---|---|---|---|---|---|---|
| Product Code | ||||||||
| P385 | 0.2813 | 0.2879 | 0.0001 | 0.9900 | 0.2171 | 0.0001 | 0.0001 | 0.9900 |
| P386 | 0.3089 | 0.3586 | 0.0143 | 0.9900 | 0.1464 | 0.0001 | 0.0001 | 0.9900 |
| P389 | 0.2698 | 0.3114 | 0.0135 | 0.9900 | 0.1818 | 0.0001 | 0.0001 | 0.9900 |
| P392 | 0.3895 | 0.4293 | 0.0307 | 0.9900 | 0.3232 | 0.0001 | 0.0001 | 0.9900 |
| P393 | 0.3045 | 0.3350 | 0.0001 | 0.9900 | 0.2171 | 0.0001 | 0.0001 | 0.9900 |
| P405 | 0.5230 | 0.5236 | 0.0001 | 0.9900 | 0.5707 | 0.0001 | 0.0001 | 0.9900 |
| P406 | 0.1547 | 0.1700 | 0.0200 | 0.9900 | 0.1111 | 0.0123 | 0.0001 | 0.9900 |
| P440 | 0.0280 | 0.0286 | 0.0286 | 0.9900 | 0.0404 | 0.0081 | 0.0001 | 0.9900 |
# Graph
plt.figure(figsize = (18,12))
plt.plot(bx_results.index, bx_results['MAPE - Single'], label = 'Single Exp Smoothing', color = 'blue', marker = 'o')
plt.plot(bx_results.index, bx_results['MAPE - Double'], label = 'Double Exp Smoothing', color = 'orange', marker = 'x')
plt.plot(bx_results.index, bx_results['MAPE - Triple'], label = 'Triple Exp Smoothing', color = 'green', marker = '^')
plt.xlabel('Product Code', size = 14)
plt.ylabel('Mean Abs Percent Error (%)', size = 14)
plt.legend(loc = 'best')
plt.title('Segment BX Mean Absolute Percent Accuracy by Product', size = 20)
plt.show()
# Table of Values
bx_results
| MAPE - Single | MAPE - Double | MAPE - Triple | |
|---|---|---|---|
| Product Code | |||
| P385 | 6.8 | 6.6 | 11.0 |
| P386 | 13.2 | 9.7 | 22.3 |
| P389 | 5.7 | 4.2 | 6.3 |
| P392 | 23.3 | 12.7 | 25.0 |
| P393 | 7.8 | 8.0 | 9.2 |
| P405 | 7.6 | 7.4 | 18.4 |
| P406 | 5.9 | 5.9 | 9.5 |
| P440 | 21.2 | 21.3 | 22.8 |
# Parameters
bx_params.set_index(['Product Code'], inplace = True)
bx_params.applymap('{:,.4f}'.format)
| Alpha - Single | Alpha - Double | Beta - Double | Phi - Double | Alpha - Triple | Beta - Triple | Gamma - Triple | Phi - Triple | |
|---|---|---|---|---|---|---|---|---|
| Product Code | ||||||||
| P385 | 0.2813 | 0.2879 | 0.0001 | 0.9900 | 0.2171 | 0.0001 | 0.0001 | 0.9900 |
| P386 | 0.3089 | 0.3586 | 0.0143 | 0.9900 | 0.1464 | 0.0001 | 0.0001 | 0.9900 |
| P389 | 0.2698 | 0.3114 | 0.0135 | 0.9900 | 0.1818 | 0.0001 | 0.0001 | 0.9900 |
| P392 | 0.3895 | 0.4293 | 0.0307 | 0.9900 | 0.3232 | 0.0001 | 0.0001 | 0.9900 |
| P393 | 0.3045 | 0.3350 | 0.0001 | 0.9900 | 0.2171 | 0.0001 | 0.0001 | 0.9900 |
| P405 | 0.5230 | 0.5236 | 0.0001 | 0.9900 | 0.5707 | 0.0001 | 0.0001 | 0.9900 |
| P406 | 0.1547 | 0.1700 | 0.0200 | 0.9900 | 0.1111 | 0.0123 | 0.0001 | 0.9900 |
| P440 | 0.0280 | 0.0286 | 0.0286 | 0.9900 | 0.0404 | 0.0081 | 0.0001 | 0.9900 |
# Graph
plt.figure(figsize = (18,12))
plt.plot(cx_results.index, cx_results['MAPE - Single'], label = 'Single Exp Smoothing', color = 'blue', marker = 'o')
plt.plot(cx_results.index, cx_results['MAPE - Double'], label = 'Double Exp Smoothing', color = 'orange', marker = 'x')
plt.plot(cx_results.index, cx_results['MAPE - Triple'], label = 'Triple Exp Smoothing', color = 'green', marker = '^')
plt.xlabel('Product Code', size = 14)
plt.ylabel('Mean Abs Percent Error (%)', size = 14)
plt.legend(loc = 'best')
plt.title('Segment CX Mean Absolute Percent Accuracy by Product', size = 20)
plt.show()
# Table of Values
cx_results
| MAPE - Single | MAPE - Double | MAPE - Triple | |
|---|---|---|---|
| Product Code | |||
| P401 | 33.4 | 28.3 | 33.1 |
| P402 | 32.6 | 21.2 | 36.0 |
| P410 | 46.0 | 42.7 | 67.2 |
| P415 | 42.3 | 41.6 | 43.1 |
| P416 | 43.4 | 42.6 | 46.8 |
| P418 | 28.0 | 28.9 | 44.4 |
| P421 | 31.6 | 32.3 | 39.1 |
| P422 | 23.4 | 23.4 | 37.7 |
| P424 | 24.4 | 24.4 | 45.9 |
| P426 | 26.8 | 26.2 | 37.3 |
| P430 | 38.0 | 38.5 | 37.6 |
| P437 | 102.8 | 102.1 | 57.2 |
| P438 | 21.8 | 23.8 | 24.4 |
| P439 | 26.7 | 26.7 | 29.3 |
| P441 | 17.0 | 17.3 | 18.7 |
| P442 | 26.5 | 27.4 | 40.5 |
| P447 | 12.9 | 9.1 | 31.2 |
| P452 | 19.4 | 19.3 | 24.4 |
| P453 | 19.4 | 14.6 | 34.8 |
| P454 | 14.9 | 16.8 | 15.0 |
| P455 | 16.7 | 16.6 | 14.5 |
| P457 | 10.5 | 10.7 | 11.7 |
| P458 | 12.9 | 11.9 | 15.2 |
| P459 | 13.9 | 14.3 | 13.9 |
| P460 | 11.0 | 11.5 | 11.2 |
# Parameters
cx_params.set_index(['Product Code'], inplace = True)
cx_params.applymap('{:,.4f}'.format)
| Alpha - Single | Alpha - Double | Beta - Double | Phi - Double | Alpha - Triple | Beta - Triple | Gamma - Triple | Phi - Triple | |
|---|---|---|---|---|---|---|---|---|
| Product Code | ||||||||
| P401 | 0.1435 | 0.1229 | 0.0655 | 0.9900 | 0.0757 | 0.0108 | 0.1027 | 0.9900 |
| P402 | 0.0977 | 0.1229 | 0.0737 | 0.9900 | 0.0757 | 0.0108 | 0.1369 | 0.9900 |
| P410 | 0.0803 | 0.2407 | 0.0229 | 0.9900 | 0.0404 | 0.0001 | 0.5141 | 0.9900 |
| P415 | 0.0000 | 0.0286 | 0.0286 | 0.9900 | 0.0052 | 0.0001 | 0.2132 | 0.9900 |
| P416 | 0.0380 | 0.0992 | 0.0992 | 0.9898 | 0.0050 | 0.0001 | 0.1422 | 0.9900 |
| P418 | 0.0921 | 0.1482 | 0.0739 | 0.9900 | 0.0050 | 0.0050 | 0.4620 | 0.9900 |
| P421 | 0.0163 | 0.1226 | 0.1223 | 0.9900 | 0.1009 | 0.0535 | 0.4503 | 0.9840 |
| P422 | 0.0208 | 0.0521 | 0.0521 | 0.9900 | 0.0050 | 0.0050 | 0.6396 | 0.9900 |
| P424 | 0.1128 | 0.1464 | 0.0001 | 0.9900 | 0.0051 | 0.0001 | 0.2843 | 0.9900 |
| P426 | 0.1314 | 0.1967 | 0.0177 | 0.9710 | 0.0423 | 0.0002 | 0.2747 | 0.9896 |
| P430 | 0.0744 | 0.0993 | 0.0153 | 0.9899 | 0.0050 | 0.0001 | 0.2843 | 0.9900 |
| P437 | 0.4617 | 0.4517 | 0.0001 | 0.9895 | 0.1501 | 0.0008 | 0.5535 | 0.9892 |
| P438 | 0.0563 | 0.0757 | 0.0757 | 0.9900 | 0.0050 | 0.0050 | 0.4975 | 0.9900 |
| P439 | 0.0563 | 0.0521 | 0.0406 | 0.9900 | 0.0050 | 0.0050 | 0.4264 | 0.9900 |
| P441 | 0.0563 | 0.0521 | 0.0521 | 0.9900 | 0.0050 | 0.0001 | 0.2843 | 0.9900 |
| P442 | 0.0874 | 0.1700 | 0.0001 | 0.9900 | 0.1834 | 0.0008 | 0.4087 | 0.9893 |
| P447 | 0.3528 | 0.3821 | 0.0147 | 0.9900 | 0.1464 | 0.0001 | 0.2298 | 0.9900 |
| P452 | 0.1676 | 0.1355 | 0.0537 | 0.9711 | 0.1125 | 0.0003 | 0.6235 | 0.9900 |
| P453 | 0.1804 | 0.1698 | 0.0201 | 0.9900 | 0.1494 | 0.0008 | 0.3929 | 0.9893 |
| P454 | 0.1126 | 0.0286 | 0.0041 | 0.9900 | 0.0060 | 0.0060 | 0.4975 | 0.9898 |
| P455 | 0.0874 | 0.0893 | 0.0001 | 0.9709 | 0.0050 | 0.0050 | 0.3909 | 0.9900 |
| P457 | 0.0050 | 0.0993 | 0.0840 | 0.9900 | 0.0404 | 0.0081 | 0.3427 | 0.9900 |
| P458 | 0.1154 | 0.1700 | 0.0600 | 0.9900 | 0.0404 | 0.0081 | 0.3085 | 0.9900 |
| P459 | 0.1017 | 0.0757 | 0.0551 | 0.9900 | 0.0757 | 0.0001 | 0.3765 | 0.9900 |
| P460 | 0.0741 | 0.0757 | 0.0757 | 0.9900 | 0.0404 | 0.0001 | 0.3427 | 0.9900 |
# Graph
plt.figure(figsize = (18,12))
plt.plot(cy_results.index, cy_results['MAPE - Single'], label = 'Single Exp Smoothing', color = 'blue', marker = 'o')
plt.plot(cy_results.index, cy_results['MAPE - Double'], label = 'Double Exp Smoothing', color = 'orange', marker = 'x')
plt.plot(cy_results.index, cy_results['MAPE - Triple'], label = 'Triple Exp Smoothing', color = 'green', marker = '^')
plt.xlabel('Product Code', size = 14)
plt.ylabel('Mean Abs Percent Error (%)', size = 14)
plt.legend(loc = 'best')
plt.title('Segment CY Mean Absolute Percent Accuracy by Product', size = 20)
plt.show()
# Table of Values
cy_results
| MAPE - Single | MAPE - Double | MAPE - Triple | |
|---|---|---|---|
| Product Code | |||
| P396 | 26.9 | 41.6 | 38.0 |
| P397 | 48.1 | 56.3 | 62.2 |
| P399 | 53.4 | 32.1 | 39.5 |
| P400 | 86.0 | 77.4 | 68.3 |
| P419 | 28.0 | 27.8 | 34.9 |
| P420 | 23.7 | 23.6 | 36.7 |
| P423 | 32.4 | 50.4 | 34.1 |
| P425 | 79.1 | 77.6 | 72.9 |
| P427 | 24.8 | 28.9 | 31.6 |
| P428 | 22.3 | 23.2 | 37.2 |
| P429 | 21.4 | 21.5 | 35.0 |
| P431 | 36.9 | 37.2 | 34.5 |
| P432 | 38.7 | 38.0 | 36.9 |
| P433 | 32.6 | 32.8 | 32.0 |
| P434 | 24.0 | 24.7 | 26.7 |
| P448 | 33.6 | 33.8 | 36.9 |
| P449 | 24.1 | 24.5 | 25.1 |
| P450 | 29.1 | 28.2 | 38.0 |
| P451 | 36.1 | 37.6 | 42.4 |
# Parameters
cy_params.set_index(['Product Code'], inplace = True)
cy_params.applymap('{:,.4f}'.format)
| Alpha - Single | Alpha - Double | Beta - Double | Phi - Double | Alpha - Triple | Beta - Triple | Gamma - Triple | Phi - Triple | |
|---|---|---|---|---|---|---|---|---|
| Product Code | ||||||||
| P396 | 0.0381 | 0.1072 | 0.0562 | 0.9658 | 0.0049 | 0.0049 | 0.0001 | 0.9901 |
| P397 | 0.0261 | 0.0993 | 0.0993 | 0.9900 | 0.0416 | 0.0084 | 0.0014 | 0.9900 |
| P399 | 0.0000 | 0.1229 | 0.0001 | 0.9900 | 0.0404 | 0.0242 | 0.0001 | 0.9900 |
| P400 | 0.0316 | 0.0995 | 0.0153 | 0.9900 | 0.0403 | 0.0080 | 0.0002 | 0.9892 |
| P419 | 0.0273 | 0.0757 | 0.0619 | 0.9899 | 0.0440 | 0.0263 | 0.0037 | 0.9900 |
| P420 | 0.0214 | 0.0756 | 0.0754 | 0.9898 | 0.0452 | 0.0452 | 0.0387 | 0.9824 |
| P423 | 0.1275 | 0.1240 | 0.1211 | 0.9851 | 0.0050 | 0.0050 | 0.0001 | 0.9900 |
| P425 | 0.2417 | 0.2364 | 0.0002 | 0.9900 | 0.1141 | 0.0004 | 0.0027 | 0.9895 |
| P427 | 0.0122 | 0.0523 | 0.0523 | 0.9900 | 0.0496 | 0.0032 | 0.0427 | 0.9815 |
| P428 | 0.0078 | 0.0521 | 0.0521 | 0.9900 | 0.0064 | 0.0001 | 0.0015 | 0.9897 |
| P429 | 0.0607 | 0.0685 | 0.0560 | 0.9708 | 0.0051 | 0.0001 | 0.0002 | 0.9900 |
| P431 | 0.0626 | 0.0546 | 0.0001 | 0.9900 | 0.0408 | 0.0245 | 0.0005 | 0.9899 |
| P432 | 0.0512 | 0.0523 | 0.0523 | 0.9900 | 0.0412 | 0.0329 | 0.0010 | 0.9899 |
| P433 | 0.0462 | 0.0521 | 0.0521 | 0.9900 | 0.0412 | 0.0412 | 0.0010 | 0.9899 |
| P434 | 0.0885 | 0.0812 | 0.0555 | 0.9537 | 0.0051 | 0.0001 | 0.0002 | 0.9900 |
| P448 | 0.1575 | 0.1466 | 0.0001 | 0.9900 | 0.1854 | 0.0013 | 0.0054 | 0.9888 |
| P449 | 0.1728 | 0.1698 | 0.0100 | 0.9900 | 0.2480 | 0.0001 | 0.0001 | 0.9901 |
| P450 | 0.0998 | 0.0521 | 0.0521 | 0.9900 | 0.0404 | 0.0001 | 0.0001 | 0.9900 |
| P451 | 0.1316 | 0.1470 | 0.0184 | 0.9899 | 0.1111 | 0.0001 | 0.0001 | 0.9900 |
# Graph
plt.figure(figsize = (18,12))
plt.plot(cz_results.index, cz_results['MAPE - Single'], label = 'Single Exp Smoothing', color = 'blue', marker = 'o')
plt.plot(cz_results.index, cz_results['MAPE - Double'], label = 'Double Exp Smoothing', color = 'orange', marker = 'x')
plt.plot(cz_results.index, cz_results['MAPE - Triple'], label = 'Triple Exp Smoothing', color = 'green', marker = '^')
plt.xlabel('Product Code', size = 14)
plt.ylabel('Mean Abs Percent Error (%)', size = 14)
plt.legend(loc = 'best')
plt.title('Segment CZ Mean Absolute Percent Accuracy by Product', size = 20)
plt.show()
# Table of Values
cz_results
| MAPE - Single | MAPE - Double | MAPE - Triple | |
|---|---|---|---|
| Product Code | |||
| P395 | 11657.4 | 10691.0 | 8154.8 |
| P398 | 63.9 | 70.9 | 85.0 |
| P403 | 23189.2 | 10409.0 | 43589.5 |
| P404 | 22521.7 | 14314.4 | 46453.1 |
| P413 | 57.3 | 55.5 | 49.6 |
| P414 | 42.9 | 40.4 | 31.1 |
| P435 | 71.6 | 70.1 | 108.0 |
| P436 | 34988.8 | 35852.2 | 46835.3 |
| P443 | 148.4 | 159.2 | 130.1 |
| P444 | 49.2 | 48.5 | 51.7 |
| P445 | 159.1 | 168.1 | 140.3 |
| P446 | 54.5 | 54.0 | 58.6 |
| P456 | 66.4 | 68.3 | 78.0 |
# Parameters
cz_params.set_index(['Product Code'], inplace = True)
cz_params.applymap('{:,.4f}'.format)
| Alpha - Single | Alpha - Double | Beta - Double | Phi - Double | Alpha - Triple | Beta - Triple | Gamma - Triple | Phi - Triple | |
|---|---|---|---|---|---|---|---|---|
| Product Code | ||||||||
| P395 | 0.0050 | 0.0278 | 0.0001 | 0.9901 | 0.0427 | 0.0002 | 0.2427 | 0.9895 |
| P398 | 0.0099 | 0.0757 | 0.0757 | 0.9900 | 0.0499 | 0.0104 | 0.3790 | 0.9900 |
| P403 | 0.3960 | 0.4293 | 0.0613 | 0.9900 | 0.2879 | 0.0001 | 0.2671 | 0.9900 |
| P404 | 0.3863 | 0.4057 | 0.0601 | 0.9900 | 0.1818 | 0.0001 | 0.3462 | 0.9900 |
| P413 | 0.0238 | 0.0766 | 0.0766 | 0.9899 | 0.0939 | 0.0101 | 0.2093 | 0.9536 |
| P414 | 0.0217 | 0.0521 | 0.0521 | 0.9900 | 0.1132 | 0.1131 | 0.3220 | 0.9711 |
| P435 | 0.0563 | 0.0762 | 0.0693 | 0.9900 | 0.0406 | 0.0404 | 0.5275 | 0.9832 |
| P436 | 0.0050 | 0.0286 | 0.0286 | 0.9900 | 0.0050 | 0.0050 | 0.2488 | 0.9900 |
| P443 | 0.0510 | 0.1464 | 0.0366 | 0.9900 | 0.0050 | 0.0001 | 0.1777 | 0.9900 |
| P444 | 0.0856 | 0.1464 | 0.0824 | 0.9900 | 0.0768 | 0.0111 | 0.4790 | 0.9899 |
| P445 | 0.0977 | 0.1464 | 0.0458 | 0.9900 | 0.0757 | 0.0001 | 0.3423 | 0.9900 |
| P446 | 0.0395 | 0.0900 | 0.0623 | 0.9708 | 0.0050 | 0.0001 | 0.3198 | 0.9900 |
| P456 | 0.2928 | 0.2878 | 0.0002 | 0.9899 | 0.2709 | 0.0161 | 0.3268 | 0.9791 |
# Graph
plt.figure(figsize = (18,12))
plt.plot(np_results.index, np_results['MAPE - Single'], label = 'Single Exp Smoothing', color = 'blue', marker = 'o')
plt.plot(np_results.index, np_results['MAPE - Double'], label = 'Double Exp Smoothing', color = 'orange', marker = 'x')
plt.xlabel('Product Code', size = 14)
plt.ylabel('Mean Abs Percent Error (%)', size = 14)
plt.legend(loc = 'best')
plt.title('Segment NP Mean Absolute Percent Accuracy by Product', size = 20)
plt.show()
# Table of Values
np_results
| MAPE - Single | MAPE - Double | |
|---|---|---|
| Product Code | ||
| P411 | 14653.3 | 4579.1 |
| P461 | 25930.9 | 24341.2 |
| P462 | 18743.5 | 20745.9 |
| P463 | 35.0 | 37.2 |
| P464 | 35.4 | 36.2 |
| P465 | 9394.4 | 61220.3 |
| P466 | 5337.3 | 4345.6 |
| P467 | 77.6 | 60.6 |
| P468 | 6272.9 | 9074.4 |
| P469 | 153.9 | 101.1 |
| P470 | 4065.3 | 3459.0 |
# Parameters
np_params.set_index(['Product Code'], inplace = True)
np_params.applymap('{:,.4f}'.format)
| Alpha - Single | Alpha - Double | Beta - Double | Phi - Double | |
|---|---|---|---|---|
| Product Code | ||||
| P411 | 0.1404 | 0.0000 | 0.0000 | 0.9950 |
| P461 | 0.0000 | 0.1250 | 0.1247 | 0.9900 |
| P462 | 0.0050 | 0.0051 | 0.0001 | 0.9900 |
| P463 | 0.0050 | 0.0992 | 0.0990 | 0.9900 |
| P464 | 0.0667 | 0.1259 | 0.1259 | 0.9900 |
| P465 | 0.4284 | 0.3369 | 0.2249 | 0.9900 |
| P466 | 0.0248 | 0.0056 | 0.0001 | 0.9847 |
| P467 | 0.3357 | 0.3572 | 0.0015 | 0.9900 |
| P468 | 0.1626 | 0.2402 | 0.0001 | 0.9896 |
| P469 | 0.0000 | 0.1341 | 0.0754 | 0.9905 |
| P470 | 0.0050 | 0.2402 | 0.0003 | 0.9873 |